给容器中注册组件的方式:
1.包扫描(@ComponentScan)+标注注解(@Controller/@Service/...等等)[局限于自己写的类]
2.@Bean 在被注释的方法中返回组件对象即可[导入的第三方包里边的组件]
3.@Import[快速的给容器中导入一个组件]
1.@Import(要导入到容器中的组件): 容器中就会自动注入这个组件,id默认是全限定名
2.ImportSelector:返回需要导入的组件全限定名数组
3.ImportBeanDefinitionRegistrar:手动注册bean到容器中
4.使用sping提供的FactoryBean(工厂bean)
1.让自定义的工厂实现FactoryBean<T>接口,默认从容器中获取到的对象是工厂生产的bean
2.要获取工厂bean的本身需要在bean名称前面加上&符号
bean的生命周期:
bean的创建---初始化---销毁过程
容器管理bean的生命周期:
我们自定义初始化和销毁方法,容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法
创建对象
单实例:在容器启动的时候创建
多实例:在每次获取的时候创建
初始化:
对象创建完成,并赋值好,调用初始化方法
销毁:
单实例:容器销毁的时候
多实例:容器不会管理这个bean,容器不会调用销毁方法
自定义bean的生命周期有4种方法
1.指定初始化方法和销毁方法:通过@Bean注解指定initMethod和destroyMethod
2.通过让Bean实现InitializingBean(定义初始化逻辑),和DisposableBean(定义销毁逻辑)
3.可以使用JSR250的注解
@PostConstruct:对象创建完成并且属性赋值完成,来执行初始化
@PreDestroy:在容器销毁之前通知其进行清理工作
4.BeanPostProcessor接口:bean的后置处理器:在bean初始化前后进行一些处理工作
postProcessBeforeInitializtion方法:在任何初始化之前调用
postProcessAfterInitializtion方法:在初始化之后调用
BeanPostProcessor原理(源码分析)
通过断点跟踪分析:
在spring的doCreateBean方法中调用栈里边发现initializeBean方法的实现大致流程:
populateBean(beanName, mbd, instanceWrapper);//装填bean(属性装填)
initializeBean{
applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);//得到容器中所有BeanPostProcessor挨个执行postProcessBeforeInitialization,直到其中有方法回null
invokeInitMethods(beanName, wrappedBean, mbd);//执行自定义初始化方法
applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);//得到容器中所有BeanPostProcessor挨个执行postProcessAfterInitialization,直到其中有方法回null
}
Spring底层对BeanPostProcessor的使用
查看BeanPostProcessor的继承关系可以发现spring源码中有非常多的类实现了此接口:
比如AsyncAnnotationBeanPostProcessor类(处理@Async注解)、
ApplicationContextAwareProcessor类(可以帮我们自己的组件注入ioc容器:Test12有示例)等等
bean的赋值,注入其他组件,@Autowired,生命周期注解功能,@Async,xxx
自定义组件想要使用Spring容器底层的一些组件(ApplicationContext,BeanFatory,xxx),
自定义组件实现xxxAware,在创建对象的时候,会调用接口规定的方法注入相关组件,
xxxAware的功能是用xxxProcessor实现的
ApplicationContextAware---------->ApplicationContextAwareProcessor
SpringAop原理【看给容器中注册了什么组件,这个组件什么时候工作,这个组件的功能是什么】
1.@EnableAspectJAutoProxy:
@Import(AspectJAutoProxyRegistrar.class):利用AspectJAutoProxyRegistrar自定义给容器中注册bean
beanName:internalAutoProxyCreator----bean:AnnotationAwareAspectJAutoProxyCreator
给容器中注册一个叫AnnotationAwareAspectJAutoProxyCreator
2.AnnotationAwareAspectJAutoProxyCreator
AnnotationAwareAspectJAutoProxyCreator
->AspectJAwareAdvisorAutoProxyCreator
->AbstractAdvisorAutoProxyCreator
->AbstractAutoProxyCreator
implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
关注后置处理器(在bean初始化完成前后做事情)、自动注入beanFactory
AbstractAutoProxyCreator.setBeanFactory()
AbstractAutoProxyCreator.有后置处理器
AbstractAdvisorAutoProxyCreator.setBeanFactory()->initBeanFactory():override
AnnotationAwareAspectJAutoProxyCreator.initBeanFactory
断点以上流程:
1.传入配置类,创建ioc容器
2.注册配置类,调用refresh(),刷新容器
3.registerBeanPostProcessors(beanFactory) : 注册bean的后置处理器,用来拦截bean的创建
1.先获取ioc容器已经定义的需要创建对象的所有beanPostProcessor
2.给容器中添加别的BeanPostProcessor
3.优先注册实现了PriorityOrdered接口的BeanPostProcessor
4.再给容器中注册实现了Ordered接口的BeanPostProcessor
5.最后注册没有实现优先级接口的BeanPostProcessor
6.注册BeanPostProcessor,实际上就是创建BeanPostProcessor对象,保存在容器中
创建org.springframework.aop.config.internalAutoProxyCreator的BeanPostProcessor[AnnotationAwareAspectJAutoProxyCreator]
1.创建bean的实例
2.populateBean 给bean的各个属性赋值
3.initializeBean 初始化bean
1.invokeAwareMethods 处理Aware接口方法的回调
2.applyBeanPostProcessorsBeforeInitialization 应用后置处理器的postProcessorBeforeInitialization
3.invokeInitMethods 执行自定义的初始化方法
4.applyBeanPostProcessorsAfterInitialization 执行后置处理器的postProcessorAfterInitialization
4.BeanPostProcessor[AnnotationAwareAspectJAutoProxyCreator] 创建成功 -->aspectJAdvisorFactory
7.把BeanPostProcessor注册到BeanFactory中
beanFactory.addBeanPostProcessor(postProcessor)