`

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

阅读更多

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

 

了解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参数就是我们需要获取的对象

 

 

 

以上是今天文章的所有内容,欢迎大家吐槽

 

推荐阅读

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

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

 

分享到:
评论

相关推荐

    Spring特性——Aware感知特性

    在Spring框架中,Aware接口系列是其核心特性之一,它为Spring容器提供了向bean注入上下文信息的能力。这些接口让bean能够感知到Spring容器的存在,从而获取必要的服务或配置信息。下面我们将深入探讨Spring的Aware...

    详解如何在低版本的Spring中快速实现类似自动配置的功能

    在低版本的Spring中实现类似自动配置的...同时,还需要结合生命周期回调和各种Aware接口,以实现Bean的定制和功能增强。通过这种方式,即使在没有高级特性支持的老版本Spring中,也能实现灵活的配置管理和功能扩展。

    Spring源码流程图

    Spring源码流程图解析 Spring源码流程图是了解...通过了解核心组件、Bean定义信息、Bean工厂、Bean生命周期和Aware接口的作用,我们可以更好地理解Spring框架的工作原理,并更好地使用Spring框架来开发应用程序。

    spring相关面试问题.docx

    3. **Aware 接口处理**:Spring 会检查 Bean 是否实现了特定的 xxxAware 接口,例如 BeanNameAware、BeanFactoryAware 和 ApplicationContextAware,然后注入相应的上下文信息。 4. **BeanPostProcessor**:如果 ...

    高级Java人才培训专家-spring高级49讲

    根据给定的信息,“高级Java人才培训专家—...通过以上详细解析,可以看出“高级Java人才培训专家—spring高级49讲”涵盖了Spring框架的核心技术和高级特性,非常适合希望深入理解和掌握Spring框架的专业开发人员。

    spring-framework-2.5.4.zip

    Spring 2.5.4加强了对多语言环境的支持,通过ResourceBundle和MessageSource接口,可以轻松实现应用程序的国际化和本地化。 6. **数据访问集成** 2.5.4版本对JDBC、Hibernate、JPA等数据访问技术进行了集成优化,...

    Spring-quartz.zip

    首先,让我们深入理解Spring如何管理静态任务。在Spring中,静态任务通常指的是那些在应用启动时就已经定义好的定时任务。这些任务可以通过`@Scheduled`注解来声明,Spring会自动管理和执行它们。例如,你可能会创建...

    spring guide

    - **Type1接口注入**:通过实现特定的接口(如Aware接口),容器会在实例化对象时调用相应的setter方法来注入依赖。 - **Type2设值注入**:这是最常见的依赖注入方式,通过setter方法注入依赖。 - **Type3构造子注入...

    spring4 中文API

    根据提供的信息,我们可以深入探讨Spring 4框架的相关知识点,包括其新特性、核心技术和关键概念。下面将逐一解析这些内容。 ### Spring Framework 总览 #### 开始与介绍 Spring Framework是一个开源的应用程序...

    spring学习源码笔记

    通过深入理解Spring的源码,我们可以更好地掌握其内部工作原理,这对于优化代码和解决复杂问题非常有帮助。Spring的设计模式和组件模型为我们提供了强大的工具,使得Java应用程序的构建更加高效和灵活。

    第二十章 Spring 应用上下文生命周期(ApplicationContext Lifecycle)1

    同时,注册实现特定Aware接口的BeanPostProcessor,如ApplicationContextAwareProcessor,确保ApplicationContext可以被其他Bean感知。还注册了ResolvableDependency对象,以便于依赖注入。 4. **BeanFactory 后置...

    spring其他标签

    本文介绍了Spring框架中不常见的标签和接口,包括对象的声明周期、各种Aware接口、初始化和销毁的回调方法等。通过理解和掌握这些内容,开发人员能够在特定场景下更灵活地使用Spring框架,提高代码的可扩展性和可...

    spring-framework-3.1.0源码

    通过深入学习和理解Spring Framework 3.1.0的源码,开发者不仅能掌握Spring的核心机制,还能了解到软件设计的优秀实践,提升自己的编程技能和架构能力。在实际项目中,结合源码分析,能够更有效地解决遇到的问题,...

    北京百度Java中级面试真题

    为了在百度这样的科技公司面试中脱颖而出,候选人需要深入理解并熟练运用这些Java和Spring框架的知识点,同时展现出良好的问题解决能力、沟通技巧和团队协作精神。通过充分的准备,可以增加成功获得中级Java开发职位...

    互联网大厂Java中级面试真题

    在互联网大厂的Java中级面试中,面试官通常会考察应聘者对Spring框架的深入理解和应用能力。以下是一些关键知识点的详细解析: **BeanFactory与ApplicationContext的区别** BeanFactory是Spring中最基本的容器,它...

    Spring入门

    ### Spring入门知识点详解 #### Spring框架概述 - **Spring**是一个开源框架,旨在简化企业级应用的开发。作为一款轻量级的Java平台框架,Spring提供了广泛的...掌握这些知识点对于深入理解和应用Spring框架至关重要。

    开源框架面试专题及答案.pdf

    Spring提供了多种管理bean生命周期的方法,包括InitializingBean和DisposableBean接口的回调方法,其他Aware接口(如BeanNameAware、ApplicationContextAware等),自定义的init()和destroy()方法,以及注解@...

    springboot学习笔记1

    Spring Boot的高级话题涵盖了Spring Aware接口,如`BeanNameAware`、`BeanFactoryAware`等,它们提供了一种让Bean感知自身和Spring容器的方式。另外,多线程和计划任务(如cron表达式)也是重要的实践内容。条件注解...

Global site tag (gtag.js) - Google Analytics