文章目录
- 获取ApplicationContext
- ApplicationContext有什么用
- 获取ApplicationContext
- 使用ApplicationContext
- 获取Environment
- Environment有什么用
- 获取Environment
- 使用Environment
获取ApplicationContext
ApplicationContext有什么用
ApplicationContext为应用程序提供配置的中央接口。在应用程序运行时,这是只读的,但如果实现支持这一点,则可以重新加载。所以,因为获取到的ApplicationContext是不可变的,通常定义一个工具类,将其封装好直接拿来用即可。
ApplicationContext提供:
- 用于访问应用程序组件的Bean工厂方法。继承自ListableBeanFactory。
- 以通用方式加载文件资源的能力。继承自org.springframe .core.io. resourceloader接口。
- 向注册的侦听器发布事件的能力。继承自ApplicationEventPublisher接口。
- 解析消息的能力,支持国际化。从MessageSource接口继承。
- 从父上下文继承。后代上下文中的定义总是具有优先级。这意味着,例如,单个父上下文可以被整个web应用程序使用,而每个servlet都有自己的子上下文,子上下文独立于任何其他servlet的子上下文。
- 除了标准的生命周期功能外,ApplicationContext实现检测并调用applicationcontextware bean以及ResourceLoaderAware、ApplicationEventPublisherAware和MessageSourceAware bean。
获取ApplicationContext
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
// 注意!这个@Component是一定要加的
@Component
public class ApplicationContextUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
/**
* 实现ApplicationContextAware的setApplicationContext方法,获取到ApplicationContext
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
/**
* 取得存储在静态变量中的ApplicationContext.
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
}
此时我们可以在普通类中直接ApplicationContextUtils.getApplicationContext(),就可以获取ApplicationContext了,不需要额外注入这个ApplicationContextUtils。
或者每个需要使用ApplicationContext 的类,各自实现ApplicationContextAware接口,拿到ApplicationContext也是可以的。
使用ApplicationContext
ApplicationContext有很多方法,常用的就是获取bean了:
获取Environment
某个bean,实现EnvironmentAware接口,就可以得到运行的环境了。
Environment有什么用
Environment接口,表示当前应用程序运行的环境。建模应用程序环境的两个关键方面:概要文件和属性。与属性访问相关的方法通过PropertyResolver超接口公开。
概要文件是一个命名的、逻辑的bean定义组,仅当给定的概要文件是活动的时才向容器注册。可以将bean分配给配置文件,无论是在XML中定义的还是通过注释定义的。与概要文件相关的Environment对象的作用是确定哪些概要文件(如果有的话)当前是活动的,以及哪些概要文件(如果有的话)在默认情况下应该是活动的。
属性在几乎所有应用程序中都扮演着重要的角色,并且可能来自各种来源:属性文件、JVM系统属性、系统环境变量、JNDI、servlet上下文参数、特别的Properties对象、映射等等。与属性相关的环境对象的作用是为用户提供一个方便的服务接口,用于配置属性源并从中解析属性。
在ApplicationContext中管理的bean可以注册为EnvironmentAware或@Inject the Environment,以便查询概要文件状态或直接解析属性。
然而,在大多数情况下,应用程序级bean不应该需要与环境直接交互,而是可能必须具有${…}属性值被属性占位符配置器替换,例如PropertySourcesPlaceholderConfigurer,它本身是EnvironmentAware的,并且从Spring 3.1开始在使用 时默认注册。
环境对象的配置必须通过ConfigurableEnvironment接口完成,该接口从所有AbstractApplicationContext子类getEnvironment()方法返回。
获取Environment
import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
// 一定要加@Component
@Component
public class EnvironmentUtils implements EnvironmentAware {
private static Environment environment;
/**
* 实现EnvironmentAware的setEnvironment方法,可以使bean获取到运行时的环境
*/
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
/**
* 取得存储在静态变量中的Environment
*/
public static Environment getEnvironment() {
return environment;
}
}
使用Environment
Environment有很多方法,常用的就是获取配置信息了。