public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
this();
//将配置类注册到容器中
this.register(annotatedClasses);
//初始化容器
this.refresh();
}
org.springframework.context.annotation.AnnotationConfigApplicationContext#AnnotationConfigApplicationContext()
(1)去获取一个beanfactory
(2)获取一个BeanDefinitionReader——一些创世纪的类,实现beanfactorypostProccer接口;
(3)定义一个扫描器:不是解析实例的扫描器,是给提供给用户调用的
doscanner:扫描配置类
org.springframework.context.annotation.AnnotationConfigApplicationContext#register
把用户的config类注册到BeanDefinitionMap中;
容器初始化前的一些准备工作
向BeanDefinitionHolder中注册了如下Processor:
1、internalConfigurationAnnotationProcessor
负责解析处理所有@Configuration标签类,并将Bean定义注册到BeanFactory中
Spring如何加载和解析@Configuration标签
2、internalAutowiredAnnotationProcessor
负责解析@Autowired注解
3、internalRequiredAnnotationProcessor
4、internalCommonAnnotationProcessor
5、internalPersistenceAnnotationProcessor
org.springframework.context.support.AbstractApplicationContext#refresh
public void refresh() throws BeansException, IllegalStateException {
synchronized(this.startupShutdownMonitor) {
this.prepareRefresh();
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
this.prepareBeanFactory(beanFactory);
try {
this.postProcessBeanFactory(beanFactory);
//调用我们的bean工厂的后置处理器,会先实例话创世纪的BeanDefinition; //1、会将class转换成BeanDefinition;2把配置类中的类扫描到BeanDefinitionMap中;
this.invokeBeanFactoryPostProcessors(beanFactory);
//注册bean的后置处理器
this.registerBeanPostProcessors(beanFactory);
this.initMessageSource();
this.initApplicationEventMulticaster();
this.onRefresh();
this.registerListeners();
//注册所有的单例bean
this.finishBeanFactoryInitialization(beanFactory);
this.finishRefresh();
} catch (BeansException var5) {
this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt", var5);
this.destroyBeans();
this.cancelRefresh(var5);
throw var5;
}
}
}
IOC容器加载Bean的主要流程
this.isFactoryBean(beanName)?是不是工厂bean;
factorybean和beanfactory的区别:
factorybean用来修饰普通bean;最终getBean是调用getObject获取的实例;集成mybatis;
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])
//第一次调用bean的后置处理器;可以阻止bean的创建;总共有九次调用
beanInstance = this.resolveBeforeInstantiation(beanName, mbd);
======
//实例化bean,此时属性为空
instanceWrapper = this.createBeanInstance(beanName, mbd, args);
//属性填充
this.populateBean(beanName, mbd, instanceWrapper);
//初始化; Aware 、@PostConstruct和initLinizing、initMethod
exposedObject = this.initializeBean(beanName, exposedObject, mbd);
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)
//执行AOP动态代理
wrappedBean = this.applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
加入到一级缓存中
问题:
介绍BeanFactoryPostProcesser在spring中的用途?
可以解析配置类
spring中有哪些扩展点,以及调用时机?
在invokeBeanFactoryPostProcessors中会调用BeanFactory后置处理器,解析配置类为beandefinition;
在创建Bean的时候会调用bean的后置处理器;
在属性填充之后,会调用三个aware回调,beanInitializing,@PostConstruct,@initMethod四个回调。