运用反射机制和自定义注解模拟实现IOC容器,使其具有自动加载、自动装配和根据全限定类名获取Bean的功能。
1-1 IOC容器的本质
IOC容器可理解为是一个map,其中的一个entry可理解为一个component(组件),entry中的key为beanId(全限定类名),entry中的value为bean(类对应的对象);
具体的体现为:
1-2 自动加载
- 自动加载是指IOC容器会自动加载被@Component等(以下用@Component为例)注解标记的类,使其成为IOC容器中的一个组件;
- @Component注解加在一个类前,表示此类被IOC容器管理,成为IOC容器中的一个组件;
- 在自动加载时,容器会自动扫描给定包路径所对应的包及其子包下的所有类,判断类是否是接口,如果不是接口就再判断是否被@Component标记,如果被标记了就将其添加到IOC容器中,key为该类的全限定类名,value为该类的对象。具体流程如图:
1-3 自动装配
- 自动装配是指IOC容器会自动装配容器中各个bean中被@Autowired注解标记属性的属性值;
- @Autowired注解加在类中的一个属性前,表示此属性的值需要被自动装配;
- 待自动加载完成后,容器会根据keySet中的全限定类名遍历容器中各个类的各个属性,判断属性是否被@Autowired注解标记,如果被标记了,就会根据属性的类型的全限定类名(beanId)从容器中找到对应的bean,然后将找到的bean 的引用赋值给对应属性(模拟bean的scope为singleton)。具体的流程如图:
2-1 模拟情形
IOC容器自动加载 com.hutao.springioc
包及其子包下的所有类,并自动完成各类对应bean的属性装配。
2-2 目录结构
- Autowired, Component为自定义注解;
- Cat, Dog, User为实体类;
- IocContainer为IOC容器;
- Demo为测试。
2-3 实现
Autowired.java
Component.java
Cat.java
Dog.java
User.java
IocContainer.java
Demo.class
测试结果为:
注意:
1. 以上IOC容器的实现原理只是基本的原理,甚至未查看源码进行验证,仅用于初步理解;Original: https://www.cnblogs.com/certainTao/p/14028608.html
Author: certainTao
Title: IOC容器模拟实现
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/712445/
转载文章受原作者版权保护。转载请注明原作者出处!