一、介紹
1、問題引入
為了獲取已被實例化的Bean對象,如果使用再次加載配置文件的方法,可能會出現一個問題,如一些線程配置任務, 會啟動兩份,產生了冗余.
ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService)appContext.getBean("userService");
2、作用
Spring中ApplicationContextAware主要用來獲取Spring上下文(ApplicationContext )已經實例化的Bean對象。
3、簡介
當一個類實現了ApplicationContextAware接口,這個類就可以方便獲取ApplicationContext中的所有bean,即這個類可以獲取Spring配置文件中管理的所有Bean對象。
@Component
public class DateUtil implements ApplicationContextAware {private static ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext arg0) throws BeansException {applicationContext = arg0;}public static Object getObject(String id) {Object object = applicationContext.getBean(id);return object;}
}
在Spring配置文件中, 將自定義類注冊到Spring中,在類中可以靈活的獲取ApplicationContext, Spring能自動執行setApplicationContext方法,獲得ApplicationContext對象,ApplicationContext對象是由spring注入的,且Spring配置文件中存在該對象。
?4、使用場景
ApplicationContextAware獲取ApplicationContext上下文的情況,適用于當前運行的代碼和已啟動的Spring代碼處于同一個Spring上下文,否則獲取到的ApplicationContext是空的。
常見的使用場景有:
- 在監聽器中, 去監聽到事件的發生, 然后從Spring的上下文中獲取Bean對象, 去修改保存相關的業務數據.
- 在某個工具類中, 需要提供處理通用業務數據的方法等
二、使用
1、使用方法
自定義類繼承ApplicationContextAware即可,這個類一般加上@Component注解。
2、demo
比如在springboot+mybatis cache中,MybatisRedisCache需要獲取到RedisTemplate,而MybatisRedisCache 是運行時加載,不能通過@Autowired自動裝配,這時需要手動從Spring的Context上下文中獲取bean。
?Mybatis Cache(二)MybatisCache+Redis-CSDN博客
package com.pluscache.demo.util;import org.springframework.aop.support.AopUtils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;import java.lang.annotation.Annotation;
import java.util.Map;@Component
public class ApplicationContextUtil implements ApplicationContextAware {private static ApplicationContext applicationContext ;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {ApplicationContextUtil.applicationContext = applicationContext;}public static Object getBean(String name) {return ApplicationContextUtil.applicationContext.getBean(name);}public static <T> T getBean(String name, Class<T> clazz) {return applicationContext.getBean(name, clazz);}public static <T> T getBean(Class<T> clazz) {return applicationContext.getBean(clazz);}public static <T> Map<String, T> getBeansOfType(Class<T> clazz) {return applicationContext.getBeansOfType(clazz);}public static ApplicationContext getApplicationContext() {return applicationContext;}public static <T extends Annotation> T getAnnotation(Object bean, Class<T> annotationClass) {T annotation = bean.getClass().getAnnotation(annotationClass);if (annotation == null) {annotation = AopUtils.getTargetClass(bean).getAnnotation(annotationClass);}return annotation;}}
redisTemplate = (RedisTemplate) ApplicationContextUtil.getBean("redisTemplate");