当一个类实现了这个接口(ApplicationContextAware
)之后,这个类就可以方便获得ApplicationContext
中的所有 bean。换句话说,就是这个类可以直接获取 Spring 配置文件中,所有有引用到的 Bean 对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| package com.funtl.leeshop.commons.context;
import org.apache.commons.lang3.Validate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.DisposableBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware;
public class SpringContext implements ApplicationContextAware, DisposableBean {
private static final Logger logger = LoggerFactory.getLogger(SpringContext.class);
private static ApplicationContext applicationContext;
/** * 获取存储在静态变量中的 ApplicationContext * @return */ public static ApplicationContext getApplicationContext() { assertContextInjected(); return applicationContext; }
/** * 从静态变量 applicationContext 中获取 Bean,自动转型成所赋值对象的类型 * @param name * @param <T> * @return */ public static <T> T getBean(String name) { assertContextInjected(); return (T) applicationContext.getBean(name); }
/** * 从静态变量 applicationContext 中获取 Bean,自动转型成所赋值对象的类型 * @param clazz * @param <T> * @return */ public static <T> T getBean(Class<T> clazz) { assertContextInjected(); return applicationContext.getBean(clazz); }
/** * 实现 DisposableBean 接口,在 Context 关闭时清理静态变量 * @throws Exception */ public void destroy() throws Exception { logger.debug("清除 SpringContext 中的 ApplicationContext: {}", applicationContext); applicationContext = null; }
/** * 实现 ApplicationContextAware 接口,注入 Context 到静态变量中 * @param applicationContext * @throws BeansException */ public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { SpringContext.applicationContext = applicationContext; }
/** * 断言 Context 已经注入 */ private static void assertContextInjected() { Validate.validState(applicationContext != null, "applicationContext 属性未注入,请在 spring-context.xml 配置中定义 SpringContext"); } }
|
还需要在 spring-context.xml
配置文件中装配 <bean id="springContext" class="com.funtl.leeshop.commons.context.SpringContext" />
;
注意:请将该 Bean 放在配置顶部,否则使用时会报错
spring.xml文件错误示例
Spring-context.xml中的书写如下:
![](http://cdn.panyucable.cn/zysheep/spring2 (1).png)
后台报错信息:
![](http://cdn.panyucable.cn/zysheep/spring2 (2).png)
总结: 在实现了ApplicaionContextAware
类中打断点调试,发现spring
容器在初始化时,applicationContext
一直文null
,猜测初始化没有调用setApplicationContext
方法,所以没有为applicationContext
赋值。修改配置Bean的位置至于顶部,果然容器初始化成功,后天无报错信息
思考: spring容器在初始化时,与加载bean的顺序有关,写在前面的bean先加载,写在后面的bean后加载。