前面几篇文章简单的介绍了spring中bean注解以及怎么在spring实现bean自动注入对应的bean,未查看的同学可以点击查看:


了解spring容器的IOC(依赖注入)的同学应该知道,我们的所有的bean对于spring容器是无意识的,啥叫无意识呢,就是你完全可以把spring容器替换成其他的容器而不需要改变你的代码,并且bean之间也是没有耦合的,既然这样,那问题就来,假如现在我们需要对spring有意识,换句话说就是现在我们的业务可能需要用到spring底层的一些功能那么我们该怎么实现?这个其实优秀的spring框架早就帮我们想到了,那就是spring提供了一系列的xxxAware接口供我们自己来实现使用


首先我来看一张图如下:


深入理解spring之Aware接口的相关实现_java

从这个图中我们可以看到spring给我们提供了多达12种Aware接口,这边我们主要演示一下BeanNameAware,ResourceLoaderAware,ApplicationContextAware,BeanFactoryAware的使用,其他的xxxAware感兴趣的同学可以自己下去试试

首先我们新建一个MyAware如下:


/**
* 定义一个继承了BeanNameAware,
*             ResourceLoaderAware,
*             ApplicationContextAware,
*             BeanFactoryAware
*            的bean
* @author zhangqh
* @date 2018年5月19日
*/

public class MyAware implements BeanNameAware,ResourceLoaderAware,ApplicationContextAware,BeanFactoryAware{
   private String beanName;
   private ResourceLoader loader;
   private ApplicationContext applicationContext;
   private BeanFactory beanFactory;
   // BeanFactoryAware中的方法
   public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
       this.beanFactory = beanFactory;
   }
   // ApplicationContextAware中的方法
   public void setApplicationContext(ApplicationContext applicationContext)
           throws BeansException
{
       this.applicationContext = applicationContext;
   }
   // ResourceLoaderAware中的方法
   public void setResourceLoader(ResourceLoader resourceLoader) {
       this.loader = resourceLoader;
   }
   public void printResult() throws IOException {
       System.out.println("BeanNameAware Bean的名称是:" + beanName);
       Resource resource = loader.getResource("classpath:test.txt");
       System.out.println("----------------------------------------" );
       System.out.print("ResourceLoaderAware ResourceLoader加载的内容是:");
       String line = null;
       BufferedReader reader = new BufferedReader(new InputStreamReader(
               resource.getInputStream()));
       while ((line = reader.readLine()) != null) {
           System.out.println(line);
       }
       reader.close();
       Environment environment = applicationContext.getEnvironment();
       System.out.println("----------------------------------------" );
       System.out.println("ApplicationContextAware 系统是:" + environment.getProperty("os.name"));
       boolean flow = beanFactory.isSingleton(beanName);
       System.out.println("----------------------------------------" );
       System.out.println("BeanFactoryAware bean【" + beanName+" 】是单例嘛:"+flow);
   }
   // BeanNameAware中的方法
   public void setBeanName(String name) {
       this.beanName = name;
   }
}


src\main\resources目录下边我们有一个test.txt文件内容是:


i'm test data


测试方法如下:


AnnotationConfigApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(MainScanConfig.class);
MyAware myAware = (MyAware) applicationContext2.getBean("myAware");
myAware.printResult();


运行结果如下:


BeanNameAware Bean的名称是:myAware
----------------------------------------
ResourceLoaderAware ResourceLoader加载的内容是:i'm test data
----------------------------------------
ApplicationContextAware 系统是:Windows 7
----------------------------------------
BeanFactoryAware beanmyAware 】是单例嘛:true


从以上测试结果可以发现我们需要注入spring相关的服务已经成功的加入到了我们自定义的MyAware中了


好了,看了这么的我们稍微简单的总结下xxxAware接口

  • 都是Aware接口的子接口,即都继承了Aware接口 

  • 父接口Aware中没有定义任何方法

  • 接口内均定义了一个set方法,set参数就是我们需要获取的对象


以上是今天文章的所有内容,欢迎大家吐槽深入理解spring之Aware接口的相关实现_spring_02


深入理解spring之Aware接口的相关实现_spring_03

推荐阅读

深入理解spring之Aware接口的相关实现_spring_04

全网最全技术视频和电子书免费发放

更多优质文章请关注以下公众号查阅:


深入理解spring之Aware接口的相关实现_spring_05