这是我参与更文挑战的第1天,活动详情查看: 更文挑战
1.前言
日常开发过程中你可能需要根据名称从IOC容器中获取Bean对象、可能需要根据类型从IOC容器中获取一组Bean对象、也可能需要根据key读取配置文件中的value。
从IOC容器中获取Bean你需要使用ApplicationContext,从配置文件中读取配置你需要使用Environment,那么ApplicationContext和Environment你应该如何获取呢?
2.ApplicationContext
2.1 实现ApplicationContextAware接口
xxxAware接口有一种赋能作用,就是你想拥有什么能力,只需要实现对应的接口即可。比如想拥有获取容器内容能力,只需要实现ApplicationContextAware接口
@Component
public class RegisterEventPublisher implements ApplicationContextAware {
    private ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}
复制代码
2.2 监听ApplicationContextInitializedEvent事件
想拥有获取容器内容能力,除了实现ApplicationContextAware接口之外,你还可以监听ApplicationContextInitializedEvent事件
public class ApplicationContextInitializedEventListener implements ApplicationListener<ApplicationContextInitializedEvent> {
    @Override
    public void onApplicationEvent(ApplicationContextInitializedEvent event) {
        ApplicationContextUtils.setApplicationContext(event.getApplicationContext());
    }
}
复制代码
3.Environment
3.1 实现EnvironmentAware接口
同2.1章节一致,想要拥有获取配置能力,只需要实现EnvironmentAware接口
@Component
public class xxxx implements EnvironmentAware {
    private Environment environment;
    @Override
    public void setEnvironment(Environment environment) {
        this.environment = environment;
    }
}
复制代码
3.2 监听ApplicationEnvironmentPreparedEvent事件
想要拥有获取配置能力,除了实现EnvironmentAware接口之外,你还可以监听ApplicationEnvironmentPreparedEvent事件
public class ApplicationEnvironmentListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {
    @Override
    public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
        ApplicationContextUtils.setEnvironment(event.getEnvironment());
    }
}
复制代码
由于ApplicationEnvironmentPreparedEvent事件是在容器刷新之前发布的,因此通过@Component注解标注不会生效,需要在spring.factories中指定
org.springframework.context.ApplicationListener= \
  com.boot.example.listener.ApplicationEnvironmentListener,\
  com.boot.example.listener.ApplicationContextInitializedEventListener
复制代码
4.封装
通过上面介绍你已经知道了如何获取ApplicationContext和Environment。实现接口的方式实际使用过程中会有些繁琐,每个想用到的地方必须满足两个条件
- 实现xxxAware接口
 - 本身是一个
Bean也就是要被@Component注解标注 
鉴于此,我们可以选择使用监听器方式封装一个工具类,这样可以达到随用随取的作用
4.1 工具类封装
public class ApplicationContextUtils {
    private static ApplicationContext applicationContext;
    private static Environment environment;
    private ApplicationContextUtils() {
    }
    public static void setApplicationContext(ApplicationContext applicationContext) {
        ApplicationContextUtils.applicationContext = applicationContext;
    }
    public static ApplicationContext getApplicationContext() {
        return ApplicationContextUtils.applicationContext;
    }
    public static void setEnvironment(Environment environment) {
        ApplicationContextUtils.environment = environment;
    }
    public static Environment getEnvironment() {
        return ApplicationContextUtils.environment;
    }
}
复制代码
4.2 监听ApplicationContextInitializedEvent事件
public class ApplicationContextInitializedEventListener implements ApplicationListener<ApplicationContextInitializedEvent> {
    @Override
    public void onApplicationEvent(ApplicationContextInitializedEvent event) {
        ApplicationContextUtils.setApplicationContext(event.getApplicationContext());
    }
}
复制代码
4.3 监听ApplicationEnvironmentPreparedEvent事件
public class ApplicationEnvironmentListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {
    @Override
    public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
        ApplicationContextUtils.setEnvironment(event.getEnvironment());
    }
}
复制代码
                    © 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
    



















![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)