执行AnnotationConfigApplicationContext ioc = new AnnotationConfigApplicationContext(AppConfig.class);
后,会触发以下关于bean创建的流程
- 扫描配置文件指定的包下有注解的类
- 将这些类包装成BeanDefinition存放入BeanFactory
- 所有的类都扫描结束后BeanFactory构建完成
- 调用实现BeanFactoryPostProcessor的类的postProcessBeanFactory方法,将BeanFactory传进去
- 根据BeanDefinition实例化单例对象(没有设置懒加载的单例)
- 依赖注入
- 调用对象实现xxxAware接口的方法
- 调用实现BeanPostProcessor的类的postProcessBeforeInitialization方法
- 调用对象实现InitializingBean接口的afterPropertiesSet方法进行初始化
- 调用实现BeanPostProcessor的类的postProcessAfterInitialization 方法
- aop
- bean创建完成
- 根据BeanDefinition判断是否为单例,如果是,则将对象存入BeanFactory
package com.fl.beans;
@Component
public class Book implements BeanNameAware,BeanFactoryAware,InitializingBean{
public Book() {
System.out.println("图书被创建了...");
}
@Override
public void setBeanFactory(BeanFactory arg0) throws BeansException {
System.out.println("BeanFactoryAware:" + arg0);
}
@Override
public void setBeanName(String arg0) {
System.out.println("BeanNameAware:" + arg0);
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("InitializingBean");
}
}
package com.fl.beans;
@Component
public class TestPostProcess implements BeanFactoryPostProcessor{
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("BeanFactoryPostProcessor");
}
}
package com.fl.beans;
@Component
public class MyBeanPostProcess implements BeanPostProcessor{
@Override
public Object postProcessAfterInitialization(Object arg0, String arg1) throws BeansException {
System.out.println("postProcessAfterInitialization:" + "object:" + arg0 + ", arg1:" + arg1);
return arg0;
}
@Override
public Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException {
System.out.println("postProcessBeforeInitialization:" + "object:" + arg0 + ", arg1:" + arg1);
return arg0;
}
}
@Configuration
@ComponentScan("com.fl.beans")
public class AppConfig {
}
public class testDemo {
@Test
public void test(){
AnnotationConfigApplicationContext ioc = new AnnotationConfigApplicationContext(AppConfig.class);
}
}
执行结果