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