之前一篇写了ApplicationListener在spring中的实现
这次写的demo试一下这个接口
先上代码
@Servicepublic class BeanPostprocessorTest implements BeanPostProcessor, ApplicationListener{ public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("++++++++++++++++++++++postProcessAfterInitialization ++++++++++++++++++++++++++"); System.out.println(beanName); return bean; } public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { // TODO Auto-generated method stub return bean; } public void onApplicationEvent(ApplicationEvent event) { System.out.println("++++++++++++++++++++++ApplicationEvent ++++++++++++++++++++++++++"); System.out.println(event.getClass().getName()); }}
这个类特别简单,但是同时实现了两个接口
BeanPostProcessor, ApplicationListener
可以只看ApplicationListener的onApplicationEvent
里面可以取到event的实现类
启动spring容器之后可以看到控制台输出了
++++++++++++++++++++++ApplicationEvent ++++++++++++++++++++++++++
org.springframework.context.event.ContextRefreshedEvent++++++++++++++++++++++ApplicationEvent ++++++++++++++++++++++++++org.springframework.context.event.ContextStartedEvent
也就是说在context refresh 和 start的时候都会执行这个方法
再看一个更实际的例子
dubbo的ServiceBean类同样实现了ApplicationListener这个接口
具体代码如下
public void onApplicationEvent(ApplicationEvent event) { if (ContextRefreshedEvent.class.getName().equals(event.getClass().getName())) { if (isDelay() && ! isExported() && ! isUnexported()) { if (logger.isInfoEnabled()) { logger.info("The service ready on spring started. service: " + getInterface()); } export(); } } }
大概意思是当ContextRefreshed时,执行export方法
下一篇说一下BeanPostProcessor这个接口