浅尝Spring注解开发,基于Spring 4.3.12
分析BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor、ApplicationListener
浅尝Spring注解开发_自定义注册组件、属性赋值、自动装配
浅尝Spring注解开发_Bean生命周期及执行过程
浅尝Spring注解开发_AOP原理及完整过程分析(源码)
浅尝Spring注解开发_声明式事务及原理
浅尝Spring注解开发_简单理解BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor、ApplicationListener
Spring注解开发_Spring容器创建概述
BeanPostProcessor
:bean后置处理器,bean创建对象初始化前后进行拦截工作的BeanFactoryPostProcessor
:beanFactory的后置处理器 BeanFactory
标准初始化之后调用,来定制和修改BeanFactory
的内容beanFactory
,但是bean的实例还未创建refresh()->invokeBeanFactoryPostProcessors(beanFactory)
BeanFactoryPostProcessor
并执行他们的方法? BeanFactory
中找到所有类型是BeanFactoryPostProcessor
的组件,Ordered
接口排序@Component public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { System.out.println("MyBeanFactoryPostProcessor...postProcessBeanFactory..."); int count = beanFactory.getBeanDefinitionCount(); String[] names = beanFactory.getBeanDefinitionNames(); System.out.println("当前BeanFactory中有"+count+" 个Bean"); System.out.println(Arrays.asList(names)); } }
输出
MyBeanFactoryPostProcessor...postProcessBeanFactory... 当前BeanFactory中有9 个Bean //[输出所有BeanDefinitionNames...] //创建注入容器中的一个Bean blue...constructor
BeanDefinitionRegistryPostProcessor
BeanFactoryPostProcessor
:BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor
postProcessBeanDefinitionRegistry()
在所有bean定义信息将要被加载,bean实例还未创建BeanFactoryPostProcessor
执行BeanDefinitionRegistryPostProcessor
给容器中再额外添加一些组件refresh()->invokeBeanFactoryPostProcessors(beanFactory)
BeanDefinitionRegistryPostProcessor
组件 Ordered
接口排序,依次触发所有的postProcessBeanDefinitionRegistry()
方法 BeanFactoryPostProcessor
方法postProcessBeanFactory()
@Component public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor{ @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { // TODO Auto-generated method stub System.out.println("MyBeanDefinitionRegistryPostProcessor...bean的数量:"+beanFactory.getBeanDefinitionCount()); } //BeanDefinitionRegistry Bean定义信息的保存中心,以后BeanFactory就是按照BeanDefinitionRegistry里面保存的每一个bean定义信息创建bean实例; @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { // TODO Auto-generated method stub System.out.println("postProcessBeanDefinitionRegistry...bean的数量:"+registry.getBeanDefinitionCount()); //再注册一个Bean,两种不同方法 //RootBeanDefinition beanDefinition = new RootBeanDefinition(Blue.class); AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Blue.class).getBeanDefinition(); registry.registerBeanDefinition("hello", beanDefinition); } }
输出
//下面两个都是MyBeanDefinitionRegistryPostProcessor方法,由于在方法内又手动注册了一个,所以是11个 postProcessBeanDefinitionRegistry...bean的数量:10 MyBeanDefinitionRegistryPostProcessor...bean的数:11 //下面一个是BeanFactoryPostProcessor方法 MyBeanFactoryPostProcessor...postProcessBeanFactory... 当前BeanFactory中有11 个Bean //输出所有BeanDefinitionNames... [org.springframework...] //两个Bean blue...constructor blue...constructor
ApplicationListener
:监听容器中发布的事件。事件驱动模型开发
public interface ApplicationListener<E extends ApplicationEvent>
:监听 ApplicationEvent
及其下面的子事件
ApplicationListener
实现类)来监听某个事件(ApplicationEvent
及其子类),或者使用@EventListener
注解标注在监听方法上ContextRefreshedEvent
:容器刷新完成(所有bean都完全创建)会发布这个事件ContextClosedEvent
:关闭容器会发布这个事件applicationContext.publishEvent()
自定义监听器
@Component public class MyApplicationListener implements ApplicationListener<ApplicationEvent> { //当容器中发布此事件以后,方法触发 @Override public void onApplicationEvent(ApplicationEvent event) { // TODO Auto-generated method stub System.out.println("收到事件:"+event); } }
@Service public class UserService { @EventListener(classes={ApplicationEvent.class}) public void listen(ApplicationEvent event){ System.out.println("UserService..监听到的事件:"+event); } }
发布事件
public class IOCTest_Ext { @Test public void test01(){ AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExtConfig.class); //发布事件; applicationContext.publishEvent(new ApplicationEvent(new String("我发布的事件")) { }); applicationContext.close(); } }
输出
//注入Bean blue...constructor //监听容器刷新事件 UserService..监听到的事件:org.springframework.context.event.ContextRefreshedEvent[] 收到事件:org.springframework.context.event.ContextRefreshedEvent[] UserService..监听到的事件:com.atguigu.test.IOCTest_Ext$1[source=我发布的事件] //监听自定义事件 UserService..监听到的事件:org.springframework.context.event.ContextClosedEvent[] 收到事件:com.atguigu.test.IOCTest_Ext$1[source=我发布的事件] //监听容器关闭事件 UserService..监听到的事件:org.springframework.context.event.ContextClosedEvent 收到事件:org.springframework.context.event.ContextClosedEvent[]
发布ContextRefreshedEvent
事件为例:
容器创建对象:refresh()
finishRefresh()
,容器刷新完成
事件发布流程:
获取事件的多播器(派发器):getApplicationEventMulticaster()
multicastEvent
派发事件
获取到所有的ApplicationListener
for (final ApplicationListener<?> listener : getApplicationListeners(event, type))
Executor
,可以支持使用Executor
进行异步派发:Executor executor = getTaskExecutor()
listener
方法:invokeListener(listener, event)
listener
回调onApplicationEvent
方法发布自定义事件
容器关闭发布ContextClosedEvent
事件
事件多播器(派发器)
refresh()
initApplicationEventMulticaster()
:初始化ApplicationEventMulticaster
id="applicationEventMulticaster"
的组件this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory)
,并且加入到容器中,我们就可以在其他组件要派发事件,自动注入这个applicationEventMulticaster
容器中有哪些监听器
refresh()
registerListeners()
applicationEventMulticaster
中String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false)
listener
注册到ApplicationEventMulticaster
中getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName)
SmartInitializingSingleton原理
@EventListener
使用EventListenerMethodProcessor
处理器来解析方法上的@EventListener
,EventListenerMethodProcessor
实现了SmartInitializingSingleton
ioc容器创建对象并refresh()
finishBeanFactoryInitialization(beanFactory)
:初始化剩下的单实例bean
先创建所有的单实例bean,getBean()
获取所有创建好的单实例bean,判断是否是SmartInitializingSingleton
类型的
如果是就调用afterSingletonsInstantiated()