Spring高级特性之一: Aware之ApplicationContextAware
Spring
的依赖注入的最大亮点就是所有的Bean
对Spring
容器的存在是没有意识的,所以可以将容器替换成别的容器。但是在实际的项目中,不可避免的要用到Spring
容器本身的功能资源,这时候Bean
必须要意识到Spring
容器的存在,才能调用Spring
所提供的资源,这就是所谓的Spring
Aware
。其实Spring
Aware
本来就是Spring
设计用来框架内部使用的,若使用了Spring
Aware
,Bean
将会和Spring
框架耦合。
Spring Aware的目的就是为了让Bean获得Srping容器的服务。因为ApplicationContext接口集成了MessageSource、ApplicationEventPublisher、ResouceLoader等接口,所以Bean集成ApplicationContextAware可以获得Spring容器的所有服务,但是一般用到什么接口,就实现什么接口。
常用到的Aware接口:
下面具体案例示例Aware在自定义注解中的应用:
需求:客户端远程调用服务端提供根据ID查询user对象的方法。
分析:客户端和服务器端之间必须约定访问接口,所以必须创建一个接口定义抽象方法。由于注入Spring容器中的Bean除了该接口实现类外还有很多其他的类,那么服务器端如何将客户端访问的API快速地从容器中匹配到呢?通常情况下,使用getBean(classname)获得bean实例。如果需match客户端提供的classname得遍历整个applicationcontext进行比较,这个效率too low。
解决方案:ApplicationContextAware+自定义注解。其核心思想就是缩小match的范围,大致逻辑为:
1)自定义注解标注客户端与服务器端约定的API实现;
2)通过ApplicationContextAware获得该容器applicationContext获得所有自定义注解的bean进行缓存。
这样即使遍历也只是遍历客户端与服务器端约定的Bean,很大程度缩小了match的范围。
具体实现:
1、自定义注解:对于自定义注解标记的类实例可以注入到容器中,此处使用了spring可识别的注解之一@Service,相当于重新包装了@Service。
2、API实现类添加注解
3、使用ApplicationContextAware处理业务逻辑