模拟扫描Bean
1. 判断传入的配置类是否带有@ComponentScan注解 e.g: new LoocaApplicationContext(AppConfig.class)<br>
2. 获取@ComponentScan注解的值当做扫描路径并扫描所有类<br>
3. 扫描的类如果带有@Component注解则需要创建成bean
如果bean实现了BeanPostProcessor接口则代表是自定义bean的后置处理器,则使用一个List来存储这些自定义bean后置处理器
如果bean没有实现BeanPostProcessor则创建一个BeanDefinition来存储bean对应的属性,并用一个Map来存储所有的BeanDefinition<br>
模拟创建Bean
1. 采用无参构造方法来创建对象实例(此处为了简化不进行推断构造函数)
2. 进行依赖注入,遍历所有属性,如果属性带有@Autowired注解就通过名称来注入值(为了简化使用通过名称)<br>
3. 如果对象实例实现了各种Aware接口则此处调用对应Aware的相应方法(源码以BeanNameAware为例)<br>
4. 遍历存放BeanPostProcessor的List执行BeanPostProcessor中的postProcessBeforeInitialization来处理初始化前方法<br>
5. 如果对象实例实现了InitializingBean接口,来调用afterProtiesSet方法来进行初始化<br>
6. 遍历存放BeanPostProcessor的List执行BeanPostProcessor中的postProcessAfterInitialization来处理初始化后方法