转载

Spring中的Aware解析

  • Spring框架中提供了许多实现了Aware接口的类,这些类主要是为了辅助Spring访问容器中的数据,比如 BeanNameAware ,这个类能够在Spring容器加载的过程中将Bean的名字(id)赋值给变量。

常用的Aware

  • BeanNameAware :能够获取bean的名称,即是id
  • BeanFactoryAware :获取BeanFactory实例
  • ApplicationContextAware :获取 ApplicationContext
  • MessageSourceAware :获取MessageSource

ApplicationContextAware

ApplicationContextAware
ApplicationContextAware
/**
 * 自定义一个实现类,一定要注入到容器中
 */
@Component
public class ApplicationContextAwareImplimplements ApplicationContextAware{

    /**
     * 容器启动的时候会调用这个方法,只需要将applicationContext设置即可
     * @param applicationContext 容器启动会自动注入
     * @throws BeansException
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext)throws BeansException {
        //将其设置到ApplicationContextUtil
        ApplicationContextUtil.setApplicationContext(applicationContext);
    }
}
  • ApplicationContextUtil 如下:
import org.springframework.context.ApplicationContext;
/**
 * ApplicationContext的工具类
 */
public class ApplicationContextUtil{
    /**
     * ApplicationContext对象,会ApplicationContextAwareImpl中的setApplicationContext方法中赋值
     */
    private static ApplicationContext applicationContext;

    public static ApplicationContext getApplicationContext(){
        return applicationContext;
    }

    public static void setApplicationContext(ApplicationContext applicationContext){
        ApplicationContextUtil.applicationContext = applicationContext;
    }

    /**
     * 根据类型获取指定的bean
     * @param requiredType Class
     * @param <T> 泛型
     * @return
     */
    public static <T> TgetBean(Class<T> requiredType ){
        return applicationContext.getBean(requiredType);
    }

    /**
     * 根据名称和类型获取Bean
     * @param name bean的id
     * @param requiredType class
     * @param <T>
     * @return
     */
    public static <T> TgetBean(String name,Class<T> requiredType){
        return applicationContext.getBean(name,requiredType);
    }
}
  • 配置了如上的工具类,那么就可以直接使用ApplicationContextUtil获取ApplicationContext对象了,而不需要注入了,如下:
StringRedisTemplate redisTemplate=ApplicationContextUtil.getBean("stringRedisTemplate",StringRedisTemplate.class);
原文  https://chenjiabing666.github.io/2019/06/12/Spring中的Aware解析/
正文到此结束
Loading...