XML版本
核心类ClassPathXmlContextLoader
的行为
- 读取指定
.xml
结尾文件的内容, 获取beanId和class属性. - 创建一个Map, 将beanId作为key存入map中. 根据class的类路径, 使用反射机制加载并新建类之后, 作为value存入map.
这里涉及到急加载和懒加载的实现
- 急加载中, 直接根据class属性使用反射加载
- 懒加载中, value先存入class属性, 也就是类路径, 再到客户端请求的时候再使用反射
交互
1.客户端新建ClassPathXmlContextLoader
加载xml文件
2.调用getBean(beanId)
方法获取map当中beanId对应的value, 也就是我们的bean
Annotation版本
@ComponentScan
核心步骤(IOC)
- 扫描指定包下所有类
- 判断类上是否有相对应注解, 返回
class
的集合 - 使用反射机制寻找出所有
class
的子包下面所有注解了@Component
的类 - 使用反射机制初始化bean到容器中
@Resource
核心步骤(DI)
1.使用反射机制, 获取当前类所有属性fields
2.判断fields
是否注解了@Resource
3.默认使用属性名字作为beanId, 搜索容器中的bean
4.如果bean存在, 将bean赋值给field
- 注意点
在初始化完所有@Component
的bean之后再初始化@Resource
的属性值. 避免有些属性值获取到没有被初始化的bean, 报null