`

ApplicationContextAware接口的作用

 
阅读更多

在Web应用中,Spring容器通常采用声明式方式配置产生:开发者只要在web.xml中配置一个Listener,该Listener将会负责初始化Spring容器,MVC框架可以直接调用Spring容器中的Bean,无需访问Spring容器本身。在这种情况下,容器中的Bean处于容器管理下,无需主动访问容器,只需接受容器的依赖注入即可。

 

但在某些特殊的情况下,Bean需要实现某个功能,但该功能必须借助于Spring容器才能实现,此时就必须让该Bean先获取Spring容器,然后借助于Spring容器实现该功能。为了让Bean获取它所在的Spring容器,可以让该Bean实现ApplicationContextAware接口。

 

下面示例为实现ApplicationContextAware的工具类,可以通过其它类引用它以操作spring容器及其中的Bean实例。

 

 

public class SpringContextHolder implements ApplicationContextAware {

private static ApplicationContext applicationContext = null;

 

/**

* 获取静态变量中的ApplicationContext.

*/

public static ApplicationContext getApplicationContext() {

assertContextInjected();

return applicationContext;

}

 

/**

* 从静态变量applicationContext中得到Bean, 自动转型为所赋值对象的类型.

*/

@SuppressWarnings("unchecked")

public static <T> T getBean(String name) {

assertContextInjected();

return (T) applicationContext.getBean(name);

}

 

/**

* 从静态变量applicationContext中得到Bean, 自动转型为所赋值对象的类型.

*/

public static <T> T getBean(Class<T> requiredType) {

assertContextInjected();

return applicationContext.getBean(requiredType);

}

 

/**

* 清除SpringContextHolder中的ApplicationContext为Null.

*/

public static void clearHolder() {

applicationContext = null;

}

 

/**

* 实现ApplicationContextAware接口, 注入Context到静态变量中.

*/

@Override

public void setApplicationContext(ApplicationContext applicationContext) {

SpringContextHolder.applicationContext = applicationContext;

}

 

/**

* 检查ApplicationContext不为空.

*/

private static void assertContextInjected() {

Validate.validState(applicationContext != null,

"applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder.");

}

 

}

Spring容器会检测容器中的所有Bean,如果发现某个Bean实现了ApplicationContextAware接口,Spring容器会在创建该Bean之后,自动调用该Bean的setApplicationContextAware()方法,调用该方法时,会将容器本身作为参数传给该方法——该方法中的实现部分将Spring传入的参数(容器本身)赋给该类对象的applicationContext实例变量,因此接下来可以通过该applicationContext实例变量来访问容器本身。

 

例如:

 

在CacheUtil中通过spring容器创建CacheManager实例

 

public class CacheUtils {

private static CacheManager cacheManager = ((CacheManager) SpringContextHolder.getBean("cacheManager"));

}

————————————————

版权声明:本文为CSDN博主「bailinbbc」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/bailinbbc/java/article/details/76446594

分享到:
评论

相关推荐

    spring入门 aware接口实现

    通过aware接口,可以对spring相应...首先创建一个类,实现ApplicationContextAware接口 , 该借口需要实现 setApplicationContext方法,该方法的参数由容器传递进来。 这样,bean 就获得了ApplicationContext这个资源

    spring-aware接口实现与bean作用域(spring多容器层面)

    `ApplicationContextAware`是其中的一个典型接口,当我们想要在非托管类(即非Spring Bean)中获取Spring容器中的其他Bean时,可以使用这个接口。 `ApplicationContextAware`接口提供了`setApplicationContext`方法...

    Spring Aware标记接口使用案例解析

    在 Spring Aware 标记接口使用案例解析中,我们可以看到一个简单的示例代码,演示了如何使用 ApplicationContextAware 接口来获取到ApplicationContext 对象。首先,我们定义了一个 SpringAware 类,该类实现了 ...

    多线程Autowire注入null的解决方案.docx

    可以创建一个帮助类,实现ApplicationContextAware接口,并在其中保存Spring ApplicationContext。然后,在需要使用service的地方,可以使用该帮助类来获取对应的bean。 在帮助类中,我们可以使用静态变量来保存...

    5. 多个service实现同一个接口 或者抽象类 1

    为了管理和使用这些bean,文件中还定义了一个`ApplicationContextHolder`类,它实现了`ApplicationContextAware`和`BeanPostProcessor`接口。`ApplicationContextAware`接口使类能够获取Spring应用上下文,从而可以...

    Spring实现Aware接口自定义获取bean的两种方式

    在Spring编程中,经常需要根据bean的名称来获取相应的bean对象,这时候,可以通过实现BeanFactoryAware和ApplicationContextAware接口来满足需求。 一、实现BeanFactoryAware接口 BeanFactoryAware接口是Spring...

    java 接口 代码实例

    在实际应用中,接口常用于设计模式,如策略模式、观察者模式等,以及在框架设计中,比如Spring框架中的`ApplicationContextAware`接口,它允许类感知并访问Spring的应用上下文。 总的来说,Java接口提供了定义行为...

    Spring源码学习八:常用的扩展接口详解1

    3. **ApplicationContextAware接口**: 这个接口有一个`setApplicationContext(ApplicationContext)`方法。实现这个接口的类能够在Bean加载过程中获取到Spring应用上下文`ApplicationContext`,从而可以访问容器中...

    spring的bean作用域

    自定义作用域需要实现ApplicationContextAware接口来获取ApplicationContext,并通过实现Scope接口来定义作用域的行为。 理解并正确使用Bean的作用域是优化Spring应用程序性能和资源管理的关键。选择合适的作用域...

    spring监听器共20页.pdf.zip

    1. **理解ApplicationContextAware接口**:当一个Bean实现了ApplicationContextAware接口,Spring容器会在Bean初始化后,自动将ApplicationContext对象注入到Bean中,使得Bean可以获取到上下文中的其他Bean。...

    Spring各种回调接口[定义].pdf

    2. **ApplicationContextAware**:此接口允许Bean直接访问ApplicationContext容器。通过实现`setApplicationContext(ApplicationContext applicationContext)`方法,Bean可以获取到容器对象,从而可以访问其他Bean、...

    com-spring-ioc-demo:源码主要是学习Spring IOC的原理,以及对Bean的注册及控制,主要运用以下类对Spring进行扩展学习:BeanPostProcessor,BeanFactoryAware,BeanNameAware,ApplicationContextAware,FactoryBean,BeanDefinitionRegistryPostProcessor,BeanFactoryPostProcessor,BeanPostProcessor,ResourceLoaderA

    com-spring-ioc-demo:源码主要是学习Spring IOC的原理,以及对Bean的注册及控制,主要运用以下类对Spring进行扩展学习:BeanPostProcessor,BeanFactoryAware,BeanNameAware,ApplicationContextAware,FactoryBean...

    普通对象使用spring容器中的对象的实现方法

    实现方法的主要思想是使用spring框架提供的ApplicationContextAware接口来获取spring容器中的对象。这个接口提供了获取ApplicationContext对象的方法,从而可以使用ApplicationContext对象来获取spring容器中的对象...

    Spring特性——Aware感知特性

    ApplicationContextAware接口扩展了BeanFactoryAware,提供了`setApplicationContext(ApplicationContext applicationContext)`方法。ApplicationContext比BeanFactory更加强大,提供了更多功能,如消息资源处理、...

    17. Spring Boot普通类调用bean【从零开始学Spring Boot】

    你可以通过实现ApplicationContextAware接口,或者直接在代码中创建ApplicationContext实例来访问bean。 5. **非Spring管理类调用bean**: 在非Spring管理的类中,如果你想使用Spring容器中的bean,有以下几种方式...

    Java获取接口所有实现类的方式详解

    public class ServiceLocator implements ApplicationContextAware { private Map, IService&gt; map; @Override public void setApplicationContext(ApplicationContext applicationContext) throws ...

    03 mybatis高级(3) 1

    它继承自AbstractSqlSessionFactoryBean,并实现了ApplicationContextAware接口,以便于从Spring容器中获取配置信息。SqlSessionFactoryBean的主要职责包括读取MyBatis的配置文件,构建SqlSessionFactory,以及处理...

    Springbean循环依赖问题,与解决方案。.docx

    2. 使用 ApplicationContextAware 接口:使用 ApplicationContextAware 接口可以在 Bean 创建时获取 ApplicationContext 对象,从而解决循环依赖的问题。 3. 使用依赖注入容器:使用依赖注入容器可以自动解决循环...

    获取spring容器的方法

    本文将深入探讨几种常见的获取Spring容器的方法,包括使用`ApplicationContext`、通过`ServletContext`、利用`ApplicationObjectSupport`、`WebApplicationObjectSupport`以及实现`ApplicationContextAware`接口等。...

Global site tag (gtag.js) - Google Analytics