spring之Aware接口

待我称王封你为后i 2022-05-21 10:28 268阅读 0赞

spring之Aware接口

一. 介绍Aware相关接口的功能

  1. Aware,顾名思义,意识到的.这个接口也就是为了让Bean意识到自己的存在.首先,我承认我第一次去看这个有关资料并没有看懂这个接口是什么意思,后来测试后才明白.依赖注入是spring的一个重要的特性,但是在springbean注入到IoC容器时,bean对于自己与spring的关系一无所知,即如王云飞所说:bean对于spring容器的存在是没有意识的,即可以把容器换成别的容器也可以,这时候Bean之间的耦合度很低.
  2. 如果Bean实现了Aware相关的接口,那么Bean就可以感知到spring容器,此时它就可以用到spring容器的功能资源.但是此时,Bean就与IoC容器耦合了.
  3. 可以先去看集成了Aware的接口

70

此处挑选部分进行介绍.

  1. BeanFactoryAware: 获取当前BeanFactory,可以调用容器服务.
  2. BeanNameAware: 获取容器中Bean的名称.
  3. ApplicationContextAware: 获取容器的上下文.可以调用容器服务.
  4. ApplicationEventPublisherAware: 应用事件发布器.主要用于发布服务.
  5. BeanClassLoadAware: 获取相关类加载器.
  6. ResourceLoadAware: 获取资源加载器.可以获取外部资源文件.
  7. MessageSourceAware: 获取message source,可以获取文本信息.
  8. ServletContextAware: 获取servlet上下问.此功能要在web服务中使用.

ApplicationContextAware接口集成了MessageSourceAware接口,ResourceLoadAware接口及 ApplicationEventPublisherAware接口,所以Bean只要实现ApplicationContextAware接口就可以获取spring容器的所有服务.但是原则上用到什么接口就是用什么接口.

二. 以BeanNameAware和ResourceLoadAware两个接口做演示

被测试文件:

70 1

被测试类:

  1. package com.yczuoxin.demo.config;
  2. import org.apache.commons.io.IOUtils;
  3. import org.springframework.beans.factory.BeanNameAware;
  4. import org.springframework.context.ResourceLoaderAware;
  5. import org.springframework.core.io.Resource;
  6. import org.springframework.core.io.ResourceLoader;
  7. import org.springframework.stereotype.Component;
  8. import java.io.IOException;
  9. @Component
  10. public class DemoBean implements BeanNameAware,ResourceLoaderAware {
  11. private String beanName;
  12. private ResourceLoader resourceLoader;
  13. @Override
  14. public void setBeanName(String name) {
  15. this.beanName = name;
  16. }
  17. @Override
  18. public void setResourceLoader(ResourceLoader resourceLoader) {
  19. this.resourceLoader = resourceLoader;
  20. }
  21. public void print(){
  22. System.out.println("DemoBean 类在spring容器中的Name: " + beanName);
  23. Resource resource = resourceLoader.getResource("classpath:test.txt");
  24. try {
  25. System.out.println("ResourceLoader 加载的文件信息为: " + IOUtils.toString(resource.getInputStream()));
  26. } catch (IOException e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. }

配置类:

  1. package com.yczuoxin.demo.config;
  2. import org.springframework.context.annotation.ComponentScan;
  3. import org.springframework.context.annotation.Configuration;
  4. @Configuration
  5. @ComponentScan("com.yczuoxin.demo.config")
  6. public class AwareConfig {
  7. }

测试类:

  1. package com.yczuoxin.demo.config;
  2. import org.springframework.context.annotation.AnnotationConfigApplicationContext;
  3. public class AwareTest {
  4. public static void main(String[] args) {
  5. AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AwareConfig.class);
  6. DemoBean demoBean = context.getBean(DemoBean.class);
  7. demoBean.print();
  8. context.close();
  9. }
  10. }
  11. DemoBean 类在spring容器中的Name: demoBean
  12. ResourceLoader 加载的文件信息为: 1234567

测试结果成功.

发表评论

表情:
评论列表 (有 0 条评论,268人围观)

还没有评论,来说两句吧...

相关阅读

    相关 spring-aware接口

    在springmvc中如果某个bean需要获取spring 的某些容器,可以通过实现其接口的方式,来获得,以此达到在Bean被初始后,能进行CRUD、数据源动态注入到全局应用等