文章目录
常用的 Spring 容器
Spring 容器是生成 Bean 实例的工厂,并管理容器中 Bean 的生命周期。
Spring 有两个核心接口:BeanFactory 以及它的子接口 ApplicationContext。它们都可以代表 Spring 容器。
- BeanFactory 的常用实现类是 DefaultListableBeanFactory.
- ApplicationContext 的常用实现类是 FileSystemXmlApplicationContext、ClassPathXmlApplicationContext 和 AnnotationConfigApplicationContext。
- Web 应用中常用的 Spring 容器有 XmlWebApplicationContext 和 AnnotationConfigWebApplicationContext 两个实现类。
Spring 容器的创建方式
对于 BeanFactory 而言,一般采用如下方式:
// 搜索类加载路径下的 beans.xml 文件创建 Resource 对象
Resource resource = new ClassPathResource("beans.xml");
// 创建默认的 BeanFactory 容器
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
// 让默认的 BeanFactory 容器加载 resource 对应的 XML 配置文件
new XmlBeanDefinitionReader(beanFactory).loadBeanDefinitions(resource);
对于 ApplicationContext 而言,一般采用如下方式:
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
如果需要同时加载多个XML配置文件来创建 Spring 容器,则可以采用如下方式:
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml", "service.xml");
ApplicationContext 和 BeanFactory 的对比
ApplicationContext 本身就是 BeanFactory 的子接口,并增强了其功能。
除了提供 BeanFactory 所支持的全部功能之外,还有如下额外的功能:
- ApplicationContext 默认会预初始化所有的 singleton 的 Bean。
- ApplicationContext 集成 MessageSource 接口,提供国际化功能。
- 资源访问,比如访问 URL 和文件。
- 事件机制。
- 同时加载多个配置文件。
- 以声明式方式启动并创建 Spring 容器。
ApplicationContext 的国际化支持
待补充…
ApplicationContext 的事见机制
待补充…
在 Bean 中获取 Spring 容器
接口注入:让 Bean 实现 BeanFactoryAware 接口,使用 setBeanFactory 方法获取 Spring 容器。
例如
类 Axe
public class Axe implements ApplicationContextAware {
// 使用成员变量保存它所在的 ApplicationContext 容器
public ApplicationContext ctx;
@Override
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
this.ctx = ctx;
}
public String chop(){
Person person = ctx.getBean(Person.class);
person.getDate();
return "use an axe to chop wood";
}
}
Spring 容器在检测到某个 Bean 实现了 ApplicationContextAware 接口,就会在创建该 Bean 之后,自动掉调用 Bean 的setApplicationContext 方法。这种方式就是接口注入。
Spring 容器中的 Bean
待补充…