Spring Framework
Spring4.x的框架图如下所示,Spring5系列官网没有给出框架图,默认和4框架基本一致。不过截止2023年2月已经出了Spring6了。

核心概念
IoC思想
Inversion of control,控制反转,主要是为了解决代码耦合度高的问题:使用对象时不直接new对象,而是由外部(即spring框架)提供对象。这样有代码改动时就不需要再重新编译运行部署。IoC只是一种思想,spring对IoC思想进行了具体实现,提供了一个IoC容器。
IoC容器负责对象的创建、初始化等,被创建或管理的对象在IoC容器中称为Bean。
IoC入门案例
步骤:
1.创建maven项目
2.添加Spring依赖的jar包
<!--pom.xml-->
<!--spring-context提供了扩展的应用程序上下文,用于在Spring应用中管理Bean的生命周期、处理事件和配置元数据等-->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>
3.添加案例中需要的类
public interface BookDao {
public void save();
}
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ...");
}
}
public interface BookService {
public void save();
}
public class BookServiceImpl implements BookService {
private BookDao bookDao = new BookDaoImpl();
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
}
4.添加Spring配置文件:
File->New->XML Configuration File->Spring Config (这一步需要先在pom.xml中添加Spring依赖,否则没有Spring Config选项)
5.配置文件中完成bean的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--bean标签标示配置bean
id属性标示给bean起名字
class属性表示给bean定义类型
-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"/>
</beans>
6.获取IoC容器
使用Spring提供的接口完成IoC容器的创建
public class App {
public static void main(String[] args) {
//获取IOC容器
//Spring提供了两种方法获取IoC容器,一种是ClassPathXmlApplicationContext,另一种是FileSystemXmlApplicationContext
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
}
}
tips:获取IoC容器的两种方式区别在于:
ClassPathXmlApplicationContext:采用的是类路径,不需要前缀,默认就是指项目的classpath路径;FileSystemXmlApplicationContext:采用的是文件系统的路径,默认指项目的根路径。此时参数要写xml的绝对路径。

7.从容器中获取对象并进行方法调用
//getBean通过id或name获取容器中的Bean对象
BookDao bookDao = (BookDao)ctx.getBean("bookDao");
bookDao.save();
DI
Dependency Injection,依赖注入,DI就是IoC思想的具体实现,在IoC容器中建立bean与bean之间的依赖关系。
例如:在原始的java项目中,一个对象A里如果要用到另一个对象B,则需要在该对象A中new出另一个对象B。而DI避免了new造成的高耦合,不需要使用new的方式,而是设置接口后直接在xml文件中通过依赖注入绑定两个对象(即bean)的关系。代码表述如下:
原始方式:
//原始方式
public class BookServiceImpl implements BookService {
//通过new的方式引用对象,若BookDaoImpl()修改了,则这里需要联动修改,耦合性较高
private BookDao bookDao = new BookDaoImpl();
@Override
public void save() {
System.out.println("book service save...");
bookDao.save();
}
}
DI注入方式:
//DI注入
public class BookServiceImpl implements BookService {
//5.spring删除了业务层中使用new的方式创建的dao对象,不直接创建对象,而是提供set接口,并在xml文件中进行依赖注入
private BookDao bookDao;
@Override
public void save() {
System.out.println("book service save...");
bookDao.save();
}
//6.提供对应的set方法,区别于5
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
}
applicationContext.xml文件
<bean id="bookDao" class="com.yuan.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.yuan.service.impl.BookServiceImpl">
<!--7.配置service和dao的关系,即依赖注入模块-->
<property name="bookDao" ref="bookDao"/>
</bean>
注意:applicationContext.xml文件中的property其实就是通过bookService里的set方法为bookDao属性赋值的,所以必须要提供set接口。