正确实现用spring扫描自定义的annotation
来源:互联网 发布:申请手机淘宝店铺步骤 编辑:程序博客网 时间:2024/05/14 14:03
今天做一个RPC远程调用框架遇到一个Spring的问题,下面是发现问题和解决方案,仅供参考。
在使用spring时,有时候有会有一些自定义annotation的需求,比如一些Listener的回调函数。
比如:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
一开始的时候,我是在Spring的ContextRefreshedEvent
事件里,通过context.getBeansWithAnnotation(Component.class)
来获取到所有的bean,然后再检查method是否有@MyListener
的annotation。
后来发现这个方法有缺陷,当有一些spring bean的@Scope
设置为session/request时,创建bean会失败。
参考:
http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-factory-scopes
在网上搜索了一些资料,发现不少人都是用context.getBeansWithAnnotation(Component.class)
,这样子来做的,但是这个方法并不对。
BeanPostProcessor接口
后来看了下spring jms里的@JmsListener
的实现,发现实现BeanPostProcessor
接口才是最合理的办法。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
所有的bean在创建完之后,都会回调postProcessAfterInitialization
函数,这时就可以确定bean是已经创建好的了。
所以扫描自定义的annotation的代码大概是这个样子的:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
SmartInitializingSingleton 接口
看spring jms的代码时,发现SmartInitializingSingleton 这个接口也比较有意思。
就是当所有的singleton的bean都初始化完了之后才会回调这个接口。不过要注意是 4.1 之后才出现的接口。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/SmartInitializingSingleton.html
- 正确实现用spring扫描自定义的annotation
- 正确实现用spring扫描自定义的annotation
- 正确实现用spring扫描自定义的annotation
- Spring自定义Annotation扫描
- Spring自定义annotation实现
- 关于spring annotation扫描目录的定义
- spring扫描annotation
- 基于Spring的AOP实现自定义annotation操作日志
- 基于Spring的AOP实现自定义annotation操作日志
- Spring AOP的annotation实现
- 用spring annotation声明的bean,当打包在jar中时,无法被扫描到
- 用spring annotation声明的bean,当打包在jar中时,无法被扫描到
- 用spring annotation声明的bean,当打包在jar中时,无法被扫描到
- 用spring annotation声明的bean,当打包在jar中时,无法被扫描到
- 自定义雷达扫描的实现
- Spring aop +自定义annotation
- spring 自定义注解的注册与扫描
- spring boot 扫描不到自定义的Controller。。。
- gem5学习4——Build System
- Android中的后台程序优化
- 使用MySql的workbench创建diagram生成的sql script在本地创建数据库
- 奶奶语重心长的说:你妈现在也是
- 【造轮子/更新】打造一个简单的万能Excel读写工具
- 正确实现用spring扫描自定义的annotation
- 简单工厂模式(python)
- Elipse 中 Android NDK 开发配置 Paths and Symbols中的Includes修改
- 允许任何来源应用运行
- iOS-EXTERN
- 其实你不知道MultiDex到底有多坑
- Android.mk 打印变量信息
- 9527cq
- Cloudera和openstack