文章目录
1. IOC概念
1.1 概念简述
控制反转:指对一个对象的控制权的反转。开发者将对象的控制权交由Spring容器去管理。
1.2 示例详解
1.2.1 代码块示例
@Data
public class Book {
private Integer id;
private String name;
private Double price;
}
public class User {
private Integer id;
private String name;
private Integer age;
public void doSth() {
Book book = new Book();
book.setId(3);
book.setName("西游记");
book.setPrice((double) 6);
}
}
1.2.2 IOC示例详解
Book 对象的控制权在 User 对象里边,这样的话Book 和 User 高度耦合。如果在其他对象中需要使用 Book 对象,得重新创建,即对象的创建、初始化、销毁等操作,统统都要开发者自己来完成。如果能够将这些操作交给容器来管理,开发者就可以极大的从对象的创建中解脱出来。使用 Spring 之后,我们可以将对象的创建、初始化、销毁等操作交给 Spring 容器来管理。即项目启动时,所有的 Bean 都将自己注册到 Spring 容器中去(如果有必要的话),然后如果其他 Bean 需要使用到这个 Bean ,则不需要自己去 new,而是直接去 Spring 容器去要。
2. IOC使用
以Xml文件注入Bean为例来做演示,使用AbstractXmlApplicationContext来获取Spring容器。
2.1 添加依赖
先创建一个普通的 Maven 项目,然后引入 spring-context 依赖:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<!-- 版本自行指定,或者跟随父工程-->
<version>5.1.9.RELEASE</version>
</dependency>
</dependencies>
2.2 向Spring容器中配置对象
在resources目录下创建一个spring的配置文件:applicationContext.xml。(注意,一定要先添加依赖,后创建配置文件,否则创建配置文件时,没有模板选项)。
<?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">
<!--class属性表示需要注册bean的全路径,
id 则表示bean的唯一标记,
也可以name属性作为bean的标记-->
<bean class="com.learning.spring.ioc.Book" id="book"/>
</beans>
2.3 从Spring容器中获取对象
在main方法中使用ClassPathXmlApplicationContext
来加载配置文件,这时Spring容器会将配置文件中定义的Bean全部创建并管理。此后,我们只需要从Spring容器中获取该对象即可,无需开发者自行创建对象;从而完成了对象控制权的反转。
使用ClassPathXmlApplicationContext是去classpath下加载配置文件;
我们也可以使用FileSystemXmlApplicationContext
,它会从操作系统路径下去寻找配置文件。
public class Main {
public static void main(String[] args) {
// 加载Spring的配置文件:Spring容器会自动加载配置文件中定义的Bean
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
// 从Spring容器中获取对象
Book book = (Book) ctx.getBean("book");
// 输出Spring容器中管理的对象
System.out.println(book);
}
}