spring bean 的生命周期
SpringBean的生命周期
1. 进入到刷新的方法refresh();
2. finishBeanFactoryInitialization()初始化所有单例 对象
3. preInstantiateSingletons(); 初始化所有的单例对象 注意:非懒加载
4. getBean() → doGetBean() 先查询该对象是否有初始化过,没有话 就创建注册到IOC容器中
5. createBean()创建对象 判断对象如果是为单例的情况下调用该方法
6. doCreateBean()创建IOC对象
7. createBeanInstance 使用java的反射技术实例化我们的对象
8. populateBean 给对象set方法属性赋值
9. invokeAwareMethods 判断bean的类型是否Aware相关依赖,如果存在的情况回调方法。
10. initializeBean 执行初始化的方法(也可以自己自定义初始化的方法)
11. applyBeanPostProcessorsBeforeInitialization 在初始化方法之前执行处理 (增强)
12. invokeInitMethods 调用自定义init方法 (使用java的反射技术)
13. applyBeanPostProcessorsAfterInitialization 在初始化方法之后执行处理(增强)
14. 正常是用我们该bean对象
15. 销毁bean。
核心的一个接口BeanPostProcessors 目的对我们bean对象自定义初始化方法实现曾强
如何知道Bean对象到底是如何创建的?
反射机制
SpringAop源码分析 需要关联SpringBean的生命周期
思考:
1. 什么时候创建代理类对象
2. SpringAOP中如何 综合运用cglib和Jdk动态
1. @EnableAspectJAutoProxy 需要开启Aop的权限
2. @Import(AspectJAutoProxyRegistrar.class)
3. AspectJAutoProxyRegistrar 手动注册 切面类
4. AnnotationAwareAspectJAutoProxyCreator 需要将该类注册的IOC容器中
5. 注册bean信息内容:
Beanid:org.springframework.aop.config.internalAutoProxyCreator
class:AnnotationAwareAspectJAutoProxyCreator
需要了解SpringAOP底层是如何实现的 离不开
AnnotationAwareAspectJAutoProxyCreator
得出结论:AnnotationAwareAspectJAutoProxyCreator祖宗是BeanPostProcessors子类。
6.BeanPostProcessors 是对我们bean的初始化方法实现增强
Init方法之前和之后处理
AnnotationAwareAspectJAutoProxyCreator 本质其实就是对init方法实现增强。
思考几个问题
AnnotationAwareAspectJAutoProxyCreator 前置和后置到底在做什么事情?
是在这个类AbstractAutoProxyCreator
前置:不会处理任何的事情
后置:postProcessAfterInitialization 使用后置处理实现代理对象一个创建
也就是任何bean对象在初始化之前都会调用AbstractAutoProxyCreator后置处理判断
是否需要创建代理类对象
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
// 有具体前置业务逻辑处理
}
// 没有具体业务逻辑的
public Object postProcessBeforeInitialization(Object bean, String beanName) {
return bean;
}
创建代理对象,如果被代理的这个类如果实现了接口的话,也就使用JDK动态代理,如果没有实现接口则使用cglib。
注意:只要是一个接口都可以
疑问:aop中存在很多通知的,每个通知最终如何形成链执行。For循环