一、基础介绍:
1、在Spring中,组件无需自己负责与其他组件的关联。取而代之的是,容器负责把协作组件的引用给予各个组件。创建系统组件之间协作关系的这个动作是DI的关键,通常被称之为装配;
2、容器可以创建组件,装配和配置组件,以及管理他们的整个生命周期(从new到finalize);
3、Spring提供了多种容器实现,并分为两类 :
Bean工厂(BeanFactory接口),提供了基础的依赖注入支持。
应用上下文(ApplicationContext接口),建立在Bean工厂基础之上,提供了系统架构服务。
4、不像其他工厂模式的实现,他们只是分发一种类型的对象,而Bean工厂是一个通用的工厂,可以创建和分发各种类型的Bean。
二、使用BeanFactory获取Bean(常用实现XmlBeanFactory)
在Spring中有几种BeanFactory的实现。其中最常使用的是org.springframework.beans.factory.xml.XmlBeanFactory,它根据XML文件中的定义装在Bean。
要创建XmlBeanFactory,需要传递一个org.springframework.core.io.Resource实例给构造函数。此Resource对象提供XML文件给工厂。
有以下几种方式配置XML源:
org.springframework.core.io.ByteArrayResource |
org.springframework.core.io.ClassPathResource |
org.springframework.core.io.DescriptiveResource |
org.springframework.core.io.FileSystemResource |
org.springframework.core.io.InputStreamResource |
org.springframework.web.portlet.contentx.PortletContextResource |
org.springframework.web.context.support.ServletContextResource |
org.springframework.core.io.UrlResource |
比如使用FileSystemResource创建一个XmlBeanFactory:
BeanFactory factory = new XmlBeanFactory(new FileSystemResource("c:/piratebean.xml"));
Bean工厂会立即把Bean定义信息载入,但是Bean只有在被需要时才被实例化;只要简单调用getBean()方法,把需要的Bean的名字传入即可。
MyBean myBean = (MyBean) factory.getBean("myBean");
表面上,ApplicationContext和BeanFactory差不多。两者都是载入Bean定义信息,装配Bean,根据需要分发Bean。
但是,ApplicationContext提供了更多功能:
1、提供了文本信息解析工具,包括对国际化(I18N)的支持。
2、提供了载入文件资源的通用方法,如载入图片。
3、可以向注册为监听器的Bean发送事件。
因此,我们应该更多的使用ApplicationContext,而不是BeanFactory。
注意:二者的关系是ApplicationContext接口扩展于BeanFactory
ApplicationContext的诸多实现中,以下三种经常用到:
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
XmlWebApplicationContext
第一种和第二种的区别在于,ClassPath可以在整个类路径(包括JAR文件)中寻找定义Bean的XML文件;而FileSystem只能在指定路径中寻找。
ApplicationContext使用方式和上面类似:
ApplicationContext context = new FileSystemXmlApplicationContext("c:/pirate.xml");
// or ~
ApplicationContext context = new ClassPathXmlApplicationContext("pirate.xml")
Author:Pirate Leo
Blog: http://blog.youkuaiyun.com/pirateleo
Email: codeevoship@gmail.com
转载请注明出处,谢谢。
若有侵权之处请致信告知,本人必将迅速处理。