为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Java


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

从这个图中我们可以看到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参数就是我们需要获取的对象


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消