您的位置:首页 > 编程语言 > Java开发

Spring 容器--如何创建和加载一个 Spring 容器?

2017-07-13 17:23 501 查看
在基于 Spring 的应用中,你的应用对象生存于 Spring 容器中。

容器是 Spring 框架的核心。Spring 容器使用 DI 管理构成应用的组件,它会创建相互协作的组件之间的关联。

Q:Spring 容器主要负责什么?

A:Spring 容器负责创建对象装配它们,配置它们并管理它们的整个生命周期,从生存到死亡。

Q:Spring自带了哪些容器实现?

A:第一类:bean 工厂是最简单的容器,提供基本的 DI 支持;第二类:应用上下文基于 BeanFactory 构建,并提供应用框架级别的服务。

Q:选择哪一类容器实现?

A:应用上下文。因为 bean 工厂对大多数应用来说往往太低级了,因此,应用上下文要比 bean 工厂更受欢迎。

2.1 使用应用上下文

Spring 自带了多种类型的应用上下文。

AnnotationConfigApplicationContext:从一个或多个基于 Java 的配置类中加载 Spring 应用上下文。

AnnotationConfigWebApplicationContext:从一个或多个基于 Java 的配置类中加载 Spring Web 应用上下文。

ClassPathXmlApplicationContext:从类路径下的一个或多个 XML 配置文件中加载上下文定义,把应用上下文的定义文件作为类资源。

FileSystemXmlapplicationcontext:从文件系统下的一个或多个 XML 配置文件中加载上下文定义。

XmlWebApplicationContext:从 Web 应用下的一个或多个 XML 配置文件中加载上下文定义。

如何使用?

// 从指定的文件系统路径下,查找 knight.xml 文件
ApplicationContext context = new FileSystemXmlApplicationContext("d:/knight.xml");

// 使用 ClassPathXmlApplicationContext 从应用的类路径下加载应用上下文
ApplicationContext context = new ClassPathXmlApplicationContext("knight.xml");

// 从 Java 配置中加载应用上下文
ApplicationContext context = new AnnotationConfigApplicationContext(com.springinaction.knights.config.KnightConfig.class);


2.2 bean 的生命周期

bean 装载到 Spring 应用上下文中的一个典型的生命周期过程。



下面进行详细描述:

Spring 对 bean 进行实例化;

Spring 将值和 bean 的引用注入到 bean 对应的属性中;

如果 bean 实现了 BeanNameAware 接口,Spring 将 bean 的 ID 传递给 setBeanName()方法

如果 bean 实现了 BeanFactoryAware 接口,Spring 将调用 setBeanFactory()方法,将 BeanFactory 容器实例传入;

如果 bean 实现了 ApplicationContextAware 接口,Spring 将调用 setApplicationContext()方法,将 bean 所在的应用上下文的引用传入进来;

如果 bean 实现了 BeanPostProcessor 接口,Spring 将调用它们的 postProcessBeforeInitialization()方法;

如果 bean 实现了 InitializingBean 接口,Spring 将调用它们的 afterPropertiesSet()方法。类似地,如果 bean 使用 initmethod 声明了初始化方法,该方法也会被
bcc6
调用;

如果 bean 实现了 BeanPostProcessor 接口,Spring 将调用它们的 postProcessAfterInitialization()方法;

此时,bean 已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,知道该应用上下文被销毁;

如果 bean 实现了 DisposableBean 接口,Spring 将调用它的 destory() 接口方法。同样,如果 bean 使用 destroymethod 声明了销毁方法,该方法也会被调用。

上一篇: Spring 是如何简化 Java 开发的?

下一篇:Spring 模块和 Spring Portfolio
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐