Spring之Bean容器初始化以及bean实例的获取
依赖注入:程序当中的一个对象依赖IOC容器将另外一个对象注入到本对象中,也就是创建各组件之间的关系
IOC容器主要用到两个包(以Spring3.2为例):
1)spring-beans-3.2.0.RELEASE.jar:主要是BeanFactory及其子类(详细内容参考;http://www.cnblogs.com/davidwang456/p/4213652.html)
2)spring-context-3.2.0.RELEASE.jar:主要是ApplicationContext及其实现类
获取Spring IOC容器代理的Bean实例的几种方式:
一、Spring中获取IOC 容器代理的Bean的实例主要依靠Bean工厂:ApplicationContext
ApplicationContext的中文意思是“应用上下文”,它继承自BeanFactory接口,除了包含BeanFactory的所有功能之外,在国际化支持、资源访问(如URL和文件)、事件传播等方面进行了良好的支持,被推荐为Java EE应用之首选,可应用在Java APP与Java Web中。
二、开发中经常的使用的ApplicationContext的实现类如下:
类 名
|
功 能 描 述
|
ClassPathXmlApplicationContext
|
从类路径ClassPath中寻找指定的XML配置文件,找到并装载
完成ApplicationContext的实例化工作。例如:
//装载单个配置文件实例化ApplicationContext容器
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//装载多个配置文件并实例化ApplicationContext容器
String[] configs = {"applicationContext1.xml","applicationContext2.xml","applicationContext3.xml"};
ApplicationContext context = new ClassPathXmlApplicationContext(configs);
在Java项目中通过ClassPathXmlApplicationContext类手动实例化ApplicationContext容器通常是不二之选
|
FileSystemXmlApplicationContext
|
从指定的文件系统路径中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。如:
//装载单个配置文件实例化ApplicationContext容器
ApplicationContext context = new FileSystemXMLApplicationContext("applicationContext.xml");
//装载多个配置文件实例化ApplicationContext容器
String[] configs = {"c:/applicationContext1.xml","c:/applicationContext2.xml"};
ApplicationContext context = new FileSystemXmlApplicationContext(configs);
说明:这种方式多用于将使用Spring框架的独立的应用程序中,因为此时需要手动的指定Spring的配置文件并初始化。
|
XmlWebApplicationContext
|
从Web应用中的寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。这是为Web工程量身定制的,使用WebApplicationContextUtils类的getRequiredWebApplicationContext(ServletContext
servletContext)方法或getWebApplicationContext(ServletContext
servletContext)方法,可在JSP与Servlet中根据ServletContext取得IoC容器的引用,例如:
import org.springframework.web.context.support.WebApplicationContextUtils;
ApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);//参数为ServletContext类型。
常用于B/S系统,通过ServletContext对象获取ApplicationContext对象,然后在通过它获取需要的类实例
而在Web项目的普通类中可以继承或实现相应的类或接口(如继承抽象类ApplicationObjectSupport、继承抽象类WebApplicationObjectSupport、实现接口ApplicationContextAware)来获取spring 的ApplicationContext对象:
但是在使用时一定要注意实现了这些类或接口的普通java类一定要在Spring 的配置文件application-context.xml文件中进行配置即将这些类注册到ApplicationContext(IOC容器)中。否则获取的ApplicationContext对象将为null |
三、Web项目中的相关应用
我们知道对于Web项目来说ApplicationContext中包含的Bean的实例化最好能够交给Web服务器来完成。主要有涉及到两方面:
1)Spring配置文件如何加载?
2)Web服务器如何实例化ApplicationContext容器中的Bean?
对于问题1:我们可以在Spring的XML的配置文件中添加如下代码:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/appContext.xml</param-value>
</context-param>
通过以上配置变可以实现在服务器启动时实例化指定的额applicationContext.xml配置文件了!
ApplicationContext.xml是Spring的默认配置文件,且当容器启动时找不到指定的配置文档时,将会尝试加载这个默认的配置文件。
对于问题2:Spring提供了两种方式在使得在Web项目启动时能够由Web服务器实例化ApplicationContext容器,无论哪种方式均可以在服务器启动时实例化Bean的目的
方式一:(较常用的方式)在applicationContext.xml配置文件中添加监听器ContextLoaderListener :
<listener>
<listener-class> org.springframework.web.context.ContextLoaderListener </listener-class>
</listener>
方式二:在applicationContext.xml配置文件中添加ContextLoaderServlet:
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>
org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
从servlet容器启动时加载组件的顺序来看,Listener组件是优先于Servlet组件的。基于Servlet方式的加载方案主要是为了兼容Servlet2.3及以下规范的Servlet容器。以Tomcat为例,Tomcat 5.x都已经支持Servlet2.4规范了,因此,基于Listener方式启动Spring容器是目前的主流选择
参考文章:1、http://baike.baidu.com/link?url=Z71Y-Uq8RHWDlSXVw9iyUBS2lIG3Hh14GdVkZ9waGGOhrl6r8CXSexs_PTN68mQM88A0CUJkQqFfzp6aFS0M8a#ref_[1]_9200243
2、http://blog.sina.com.cn/s/blog_9c7ba64d0101evar.html
3、http://blog.163.com/wangfei_sleading/blog/static/169050050201119101311349/
原文:http://m.blog.csdn.net/article/details?id=51144230