ApplicationContext为应用程序提供配置的中央接口。在应用程序运行时,这是只读的,但如果实现支持这一点,则可以重新加载。所以,因为获取到的ApplicationContext是不可变的,通常定义一个工具类,将其封装好直接拿来用即可。
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也是可以的。
某个bean,实现EnvironmentAware接口,就可以得到运行的环境了。
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()方法返回。
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;
}
}
BeanFactory是访问Spring bean容器的根接口。
该接口由包含许多bean定义的对象实现,每个bean定义由String名称唯一标识。根据bean定义,工厂将返回包含对象的独立实例(Prototype设计模式)或单个共享实例(Singleton设计模式的高级替代方案,其中实例在工厂范围内是单个实例)。返回哪种类型的实例取决于bean工厂配置:API是相同的。自Spring 2.0以来,根据具体的应用程序上下文(例如:"request"和"session"作用域)。
Bean工厂实现应该尽可能支持标准的Bean生命周期接口。完整的初始化方法集及其标准顺序为:
BeanNameAware的setBeanName
BeanClassLoaderAware的setBeanClassLoader
BeanFactoryAware的setBeanFactory
EnvironmentAware的setEnvironment
EmbeddedValueResolverAware的setEmbeddedValueResolver
ResourceLoaderAware的setResourceLoader(仅适用于在应用程序上下文中运行时)
ApplicationEventPublisherAware的setApplicationEventPublisher(仅适用于在应用程序上下文中运行时)
MessageSourceAware的setMessageSource(仅适用于在应用程序上下文中运行时)
ApplicationContextAware的setApplicationContext(仅适用于在应用程序上下文中运行时)
ServletContextAware的setServletContext(仅适用于在web应用程序上下文中运行时)
BeanPostProcessors的postProcessBeforeInitialization方法
InitializingBean的afterPropertiesSet
自定义的初始化方法定义
BeanPostProcessors的postProcessAfterInitialization方法
在关闭bean工厂时,应用以下生命周期方法:
DestructionAwareBeanPostProcessors的postProcessBeforeDestruction方法
DisposableBean的破坏
自定义的销毁方法定义
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.stereotype.Component;
@Component
public class Test implements BeanFactoryAware {
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
// 获取了beanFactory
}
}