Spring高级特性之一: Aware之ApplicationContextAware

  Spring的依赖注入的最大亮点就是所有的BeanSpring容器的存在是没有意识的,所以可以将容器替换成别的容器。但是在实际的项目中,不可避免的要用到Spring容器本身的功能资源,这时候Bean必须要意识到Spring容器的存在,才能调用Spring所提供的资源,这就是所谓的Spring Aware。其实Spring Aware本来就是Spring设计用来框架内部使用的,若使用了Spring AwareBean将会和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处理业务逻辑

              

 

posted on 2021-05-18 16:47  池塘里洗澡的鸭子  阅读(597)  评论(0编辑  收藏  举报