public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext();
context.register(AppConfig.class);
context.refresh();
UserDao dao = (UserDao) context.getBean("userDao");
UserDao dao1 = (UserDao) context.getBean("userDao");
System.out.println("dao:"+dao.hashCode()+"->dao1:"+dao1.hashCode());
dao.query();
}
执行context的构造new AnnotationConfigApplicationContext();
执行子类的构造之前会先执行父类的构造,所以先看下AnnotationConfigApplicationContext父类的构造方法做了什么事情
可以看到,在父类的构造方法当中完成了BeanFactory的实例化。
在回到AnnotationConfigApplicationContext的构造方法
看一下new AnnotatedBeanDefinitionReader(this)里面做了什么。
经过一些调用之后最终调用了AnnotationConfigUtils.registerAnnotationConfigProcessors();
在这一步会完成spring中很重要的操作:
在给定的registry(AnnotationConfigApplicationContext)中注册post processors
完成context的实例化之后,执行context.register(AppConfig.class)
这个也没什么好讲的,就是往context注册一个beandefinition。
执行context.refresh(),这个就比较重要了,进去看一下做了哪些事情。
prepareBeanFactory(beanFactory),在这个方法会配置beanFactory的一些标准化特性
关于ApplicationContextAwareProcessor参见ApplicationContextAwareProcessor用法解析。
做完准备工作之后,执行invokeBeanFactoryPostProcessors(beanFactory),在这个方法会调用所有的BeanFactoryPostProcessor,执行完这个方法后,ConfigurationClassPostProcessor实例就已经放到singletonObjects了,进入这个方法看看:
invokeBeanFactoryPostProcessors(beanFactory, beanFactoryPostProcessors)方法中定义了两种泛型类型的List:
// 用于保存常规的实现BeanFactoryPostProcessor的
// PostProcessor
List regularPostProcessors
// 保存实现BeanDefinitionRegistryPostProcessor的
// PostProcessor
List registryPostProcessors
首先,先调用实现了PriorityOrdered接口的 BeanFactoryPostProcessor,ConfigurationClassPostProcessor就实现了PriorityOrdered接口。
postProcessBeanDefinitionRegistry中调用了processConfigBeanDefinitions(registry)方法,进入这个方法。
回到processConfigBeanDefinitions(registry)方法,这时候已经拿到了Configuration配置类的候选者AppConfig,继续往下看
中间经过一些转换调用,进入了下面这个方法
此处对于@Bean的处理,还没完成beanDefinition的注册,仅仅只是将@Bean 方法保存在AppConfig的成员变量this.beanMethods中,在后续执行processConfigBeanDefinitions(BeanDefinitionRegistry registry)方法中的this.reader.loadBeanDefinitions(configClasses)这一行代码完成beanDefinition的注册。
@Import比较重要,后面在分析
扫描过程就不接着往下看了,最终会将扫描包下的类注册到beanDefinitionMap
回到上面ConfigurationClassPostProcessor的processConfigBeanDefinitions(BeanDefinitionRegistry registry)
这里已经完成了invokeBeanDefinitionRegistryPostProcessors(priorityOrderedPostProcessors, registry)
继续往下执行
进入了ConfigurationClassPostProcessor的postProcessBeanFactory()方法
如果配置类加了@configuration注解,会返回CGLIB代理类,如果没加,返回的是原生的类,有什么作用,后面在讲。
执行完invokeBeanFactoryPostProcessors后,继续往下执行
TestBeanFactoryPostProcessor没有实现PriorityOrdered和Ordered接口,参见BeanFactoryPostProcessor的简单应用
完成了我们自定义的TestBeanFactoryPostProcessor的调用。
至此完成了invokeBeanFactoryPostProcessors(beanFactory)的调用,继续往下执行。
执行完registerBeanPostProcessors(beanFactory)之后,那5个BeanPostProcessor将被注册进来,加入到beanPostProcessor列表中。我们熟悉的AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、RequiredAnnotationBeanPostProcessor实例也被放到了singletonObjects中