IOC加载流程源码
2021-04-12 09:34:55 0 举报
IOC加载流程源码
作者其他创作
大纲/内容
创建一个bean定义读取器
finishBeanFactoryInitialization
最终将bean放置到一级缓存singletonObjects 中下次就可以直接获取到了
注意这是我们的第一个beanPostProcessorInstantiationAwareBeanPostProcessor
进行初始化
实例化我们的单例bean
invokeBeanFactoryPostProcessors
refresh() 重点方法 有13步 对于IOC来说有关系的下面会展示出来
通过实现InstantiationAwareBeanPostProcessor就可以在bean实例化的时候调用postProcessBeforeInstantiation方法拦截返回的对象
单例缓存池中没有判断当前bean是否是工厂类
执行类型为BeanDefinitionRegistryPostProcessor的bean对象的postProcessBeanFactory方法
工厂
进行属性赋值
注册了很多基础的类registerAnnotationConfigProcessors
AbstractAutowireCapableBeanFactory的createBean方法
反射
ConfigurationClassPostProcessor.invokeBeanFactoryPostProcessors
从之前注册的beanDefinitionNames中获取需要实例化的bean名称
scanner = new ClassPathBeanDefinitionScanner(this)
bean = this.getBean(\"&\" + beanName);
事件相关
EventListenerMethodProcessor
类继承了registry,有bean定义注册功能是一个很重要的beanFactory
先尝试从一级缓存中获取bean获取到直接返回
将当前配置类注册到bean定义中
AnnotationConfigApplicationContext
reader = new AnnotatedBeanDefinitionReader(this)
解析配置类
ConfigurationClassPostProcessor读取配置文件的类
CommonAnnotationBeanPostProcessor
这里会将当前的config类 注册到beanDefinitionMap中。BeanDefinitionReaderUtils.registerBeanDefinition
反射1.无参构造器是默认的方式2.通过有参构造函数自动装配
执行类型为BeanFactoryPostProcessor的bean对象。执行顺序为 1 实现PriorityOrdered 2 实现 Ordered3 没有实现上面两个接口的。执行方法为postProcessBeanFactory
真正执行创建bean 的方法包括实例化 填充value和注入属性还有执行initialize方法
this.isFactoryBean(beanName)
它负责解析@Resource、@WebServiceRef、@EJB三个注解。
PersistenceAnnotationBeanPostProcessor
this.getSingleton()
register(componentClasses)
调用doGetBean方法
this.getBean(beanName);
也不是工厂类的走下面逻辑创建bean
List<String> beanNames = new ArrayList(this.beanDefinitionNames);
执行父类构造函数GenericApplicationContext创建一个beanFactory
在这个类中,会解析加了@Configuration的配置类,递归解析@ComponentScan、@ComponentScans注解扫描的包,以及解析@Import等注解,@Bean。
@Bean方式配置的可以认为就是工厂方式优点是可以自己控制实例化方式
执行构造函数 this();
创建一个bean定义扫描器不过配置类的ComponentScan不是用这个扫描的
执行类型为BeanDefinitionRegistryPostProcessor的bean对象。执行顺序为 1 实现PriorityOrdered 2 实现 Ordered3 没有实现上面两个接口的。执行方法为postProcessBeanDefinitionRegistry
实例化对象
instanceof FactoryBean的就是工厂类
preInstantiateSingletons
AutowiredAnnotationBeanPostProcessor
一级缓存池或者叫单例缓存池
先设置bean状态为创建中,之后执行传递过来的函数方法的getObject方法
DefaultEventListenerFactory
Object singletonInstance = this.getSingleton(beanName);
用于解析@Autowired
beanFactory = new DefaultListableBeanFactory()
0 条评论
下一页