在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
相关推荐
通过aware接口,可以对spring相应...首先创建一个类,实现ApplicationContextAware接口 , 该借口需要实现 setApplicationContext方法,该方法的参数由容器传递进来。 这样,bean 就获得了ApplicationContext这个资源
`ApplicationContextAware`是其中的一个典型接口,当我们想要在非托管类(即非Spring Bean)中获取Spring容器中的其他Bean时,可以使用这个接口。 `ApplicationContextAware`接口提供了`setApplicationContext`方法...
在 Spring Aware 标记接口使用案例解析中,我们可以看到一个简单的示例代码,演示了如何使用 ApplicationContextAware 接口来获取到ApplicationContext 对象。首先,我们定义了一个 SpringAware 类,该类实现了 ...
可以创建一个帮助类,实现ApplicationContextAware接口,并在其中保存Spring ApplicationContext。然后,在需要使用service的地方,可以使用该帮助类来获取对应的bean。 在帮助类中,我们可以使用静态变量来保存...
为了管理和使用这些bean,文件中还定义了一个`ApplicationContextHolder`类,它实现了`ApplicationContextAware`和`BeanPostProcessor`接口。`ApplicationContextAware`接口使类能够获取Spring应用上下文,从而可以...
在Spring编程中,经常需要根据bean的名称来获取相应的bean对象,这时候,可以通过实现BeanFactoryAware和ApplicationContextAware接口来满足需求。 一、实现BeanFactoryAware接口 BeanFactoryAware接口是Spring...
在实际应用中,接口常用于设计模式,如策略模式、观察者模式等,以及在框架设计中,比如Spring框架中的`ApplicationContextAware`接口,它允许类感知并访问Spring的应用上下文。 总的来说,Java接口提供了定义行为...
3. **ApplicationContextAware接口**: 这个接口有一个`setApplicationContext(ApplicationContext)`方法。实现这个接口的类能够在Bean加载过程中获取到Spring应用上下文`ApplicationContext`,从而可以访问容器中...
自定义作用域需要实现ApplicationContextAware接口来获取ApplicationContext,并通过实现Scope接口来定义作用域的行为。 理解并正确使用Bean的作用域是优化Spring应用程序性能和资源管理的关键。选择合适的作用域...
1. **理解ApplicationContextAware接口**:当一个Bean实现了ApplicationContextAware接口,Spring容器会在Bean初始化后,自动将ApplicationContext对象注入到Bean中,使得Bean可以获取到上下文中的其他Bean。...
2. **ApplicationContextAware**:此接口允许Bean直接访问ApplicationContext容器。通过实现`setApplicationContext(ApplicationContext applicationContext)`方法,Bean可以获取到容器对象,从而可以访问其他Bean、...
com-spring-ioc-demo:源码主要是学习Spring IOC的原理,以及对Bean的注册及控制,主要运用以下类对Spring进行扩展学习:BeanPostProcessor,BeanFactoryAware,BeanNameAware,ApplicationContextAware,FactoryBean...
实现方法的主要思想是使用spring框架提供的ApplicationContextAware接口来获取spring容器中的对象。这个接口提供了获取ApplicationContext对象的方法,从而可以使用ApplicationContext对象来获取spring容器中的对象...
ApplicationContextAware接口扩展了BeanFactoryAware,提供了`setApplicationContext(ApplicationContext applicationContext)`方法。ApplicationContext比BeanFactory更加强大,提供了更多功能,如消息资源处理、...
你可以通过实现ApplicationContextAware接口,或者直接在代码中创建ApplicationContext实例来访问bean。 5. **非Spring管理类调用bean**: 在非Spring管理的类中,如果你想使用Spring容器中的bean,有以下几种方式...
public class ServiceLocator implements ApplicationContextAware { private Map, IService> map; @Override public void setApplicationContext(ApplicationContext applicationContext) throws ...
它继承自AbstractSqlSessionFactoryBean,并实现了ApplicationContextAware接口,以便于从Spring容器中获取配置信息。SqlSessionFactoryBean的主要职责包括读取MyBatis的配置文件,构建SqlSessionFactory,以及处理...
2. 使用 ApplicationContextAware 接口:使用 ApplicationContextAware 接口可以在 Bean 创建时获取 ApplicationContext 对象,从而解决循环依赖的问题。 3. 使用依赖注入容器:使用依赖注入容器可以自动解决循环...
本文将深入探讨几种常见的获取Spring容器的方法,包括使用`ApplicationContext`、通过`ServletContext`、利用`ApplicationObjectSupport`、`WebApplicationObjectSupport`以及实现`ApplicationContextAware`接口等。...