3.3-IoC
优质
小牛编辑
129浏览
2023-12-01
在上文 Tomcat 实现 根据 web.xml 文件配置和浏览器请求,生成对应的 Servlet 响应请求的基础上,本文主要思考的问题是 Spring 中的对象依赖关系管理(IoC)如何实现。
1. 实现功能
1.1 配置依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.7.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.7.RELEASE</version>
</dependency>
</dependencies>
1.2 初始化方法
1.2.1 配置文件方法
1.2.1.1 xml 文件
1.2.1.2 测试类
ApplicationContext applicationContext=new ClassPathXmlApplicationContext(".xml");
Bean bean=applicationContext.getBean()
1.2.2 配置类实现
1.2.2.1 定义配置类
@Configuration
public class XXXConfig(){
@Bean
public Bean method1(){
return new Bean()
}
}
1.2.2.2 测试类
ApplicationContext applicationContext=new AnnotationConfigApplicationContext("XXXConfig");
Bean bean=applicationContext.getBean(Bean.class);
1.2.3 注解实现
1.3 注入方法
1.3.1 构造器注入
- 在实现类中定义构造器。
public BlankDisc(String title, String artist, List<String> tracks) { this.title = title; this.artist = artist; this.tracks = tracks; }
- 使用配置文件或 Configuration 进行配置。
<bean id="compactDisc" class="com.iecas.soundsystem.impl.BlankDisc" c:artist="tjj" c:title="my love"> <!--使用构造器注入 --> <constructor-arg> <list> <value>1</value> <value>1</value> <value>1</value> <value>1</value> </list> </constructor-arg> </bean>
- 使用 @Autowired 注解引用接口。
1.3.2 setter 方法注入
1.4 常见的注解
| 名称 | 参数 |功能 |配置实现|
| ------ | ------ | ------ |------| | Configuration | 接口 | 指定该类为 bean 配置类。 || | Bean | value,默认参数 | 指定 bean 名称。 || | ComponentScan | | 指定扫描的组件(标注@Component、@Controller、@Service、@Repository)所在包。 |context:component-scan| ||excludeFilters={}|指定排除的组件|| ||includeFilters={},useDefaultFilters=false|指定包含的组件|| | FileSystemXmlApplicationContext | 类 | |2. 实现原理
| 方法 | 类型 |功能 |
| ------ | ------ | ------ | | BeanFactory | 接口 | 主要定义了作为容器具备的基本功能。 | | XmlBeanFactory | 接口 | 主要是 | | ApplicationContext | 接口 | | | FileSystemXmlApplicationContext | 类 | |
2.1 BeanFactory
</br>
方法 | 功能 |
---|---|
Object getBean(String name) | 根据 bean 名称获取注册的 bean 对象 |
T getBean(String name,Class requireType) | 根据 bean 名称和Type属性 获取注册的 bean 对象 |
Object getBean(String name,Object... args) | 根据 bean 名称和参数 获取注册的 bean 对象 |
boolean containsBean(String name) | 根据 bean 名称判断 bean 对象是否已注册。 |
boolean isSinggleton(String name) | 根据 bean 名称判断 bean 对象是否为单例。 |
boolean isPrototype(String name) | 根据 bean 名称判断 bean 对象是否为多例。 |
boolean isTypeMatch(String name,Class targetType) | 根据 bean 名称判断 bean 对象是否为给定类型。 |
Class getType(String name) | 根据 bean 名称查询 bean 对象的类型。 |
String[] getAliases(String name) | 根据 bean 名称查询 bean 对象的别名。 |
2.2 XmlBeanFactory 的初始化
- 调用 成员变量 reader 的loadBeanDefinitions(resource) 方法根据 resource 对象生成 Definition 对象。
2.3 ApplicationContext 接口
2.4 FileSystemXmlApplicationContext 实现
2.5 IoC 容器的初始化过程
2.5.1 BeanDefinition 的 Resource 定位
FileSystemResource
ClassPathResource
2.5.2 BeanDefinition 的载入和解析
把用户定义好的 Bean 表示成 IoC 容器的内部数据结构(BeanDefinition)。 BeanDefinition 是 POJO(Controller、Service、Dao) 对象在 IoC 容器中的抽象。
参考资料
- Spring Framework 的核心:IoC 容器的实现