背景
在使用spring时,有时候有会有一些自定义annotation的需求,比如一些Listener的回调函数。
比如:
1 |
|
一开始的时候,我是在Spring的ContextRefreshedEvent
事件里,通过context.getBeansWithAnnotation(Component.class)
来获取到所有的bean,然后再检查method是否有@MyListener
的annotation。
后来发现这个方法有缺陷,当有一些spring bean的@Scope
设置为session/request时,创建bean会失败。
在网上搜索了一些资料,发现不少人都是用context.getBeansWithAnnotation(Component.class)
,这样子来做的,但是这个方法并不对。
BeanPostProcessor接口
后来看了下spring jms里的@JmsListener
的实现,发现实现BeanPostProcessor
接口才是最合理的办法。
1 | public interface BeanPostProcessor { |
所有的bean在创建完之后,都会回调postProcessAfterInitialization
函数,这时就可以确定bean是已经创建好的了。
所以扫描自定义的annotation的代码大概是这个样子的:
1 | public class MyListenerProcessor implements BeanPostProcessor { |
SmartInitializingSingleton 接口
看spring jms的代码时,发现SmartInitializingSingleton 这个接口也比较有意思。
就是当所有的singleton的bean都初始化完了之后才会回调这个接口。不过要注意是 4.1 之后才出现的接口。
1 | public interface SmartInitializingSingleton { |