web前端

位置:IT落伍者 >> web前端 >> 浏览文章

spring中读取xml配置文件、获取bean


发布日期:2018年01月23日
 
spring中读取xml配置文件、获取bean

读取xml文件

/**

* 利用XmlBeanFactory(Resource resource)

* 这里Resource必须是xml格式

* Resource包括AbstractResource ClassPathResource FileSystemResource

* InputStreamResource ServletContextResource UrlResource

*/

/*

* 利用 InputStreamResource(InputStream inputStream)

* 要将applicationContextxml放在项目根目录下

*/

InputStream is = null;

try {

is = new FileInputStream(applicationContextxml);

} catch (FileNotFoundException e) {

eprintStackTrace();

}

Resource resource = new InputStreamResource(is);

BeanFactory factory = new XmlBeanFactory(resource);

UserDao userDao = (UserDao)factorygetBean(userDao);

/*

* 利用 Properties

* 要将beanproperties放在类路径--源文件夹(src)目录下

*/

具体见

利用ClassPathXmlApplicationContext

可以从classpath中读取XML文件

() ApplicationContext context = new ClassPathXmlApplicationContext(applicationContextxml);

UserDao userDao = (UserDao)contextgetBean(userDao);

() ClassPathXmlApplicationContext resource = new ClassPathXmlApplicationContext(new String[]{applicationContextibatisoraclexmlapplicationContextxmlapplicationContextdataoraclexml});

BeanFactory factory = resource;

UserDao userDao = (UserDao) factorygetBean(userDao);

利用ClassPathResource

可以从classpath中读取XML文件

Resource cr = new ClassPathResource(applicationContextxml);

BeanFactory bf=new XmlBeanFactory(cr);

UserDao userDao = (UserDao)bfgetBean(userDao);

加载一个xml文件 orgspringframewonfigPropertyPlaceholderConfigurer不起作用

.利用XmlWebApplicationContext读取

从Web应用程序的文件架构中指定相对位置来读取定义文件

XmlWebApplicationContext 的建构子无法带参数参考API文件会发现预设的location会指向/WEBINF/applicationContextxml档案使用其 public static属性DEFAULT_CONFIG_LOCATION可取得此预设档名由于我使用MyEclipse预设会多一个/WebRoot的 目录在WEBINF之前因此若在web project里有一些与web无关的程式要使用context时(例如处理一些MVC架构中的M的部份)就无法使用 XmlWebApplicationContext来读取bean定义档因为default location会差一个WebRoot的目录

即 使在webxml里面在DispatcherServlet定义中重新定义contextConfigLocation也一样(此定义可以 override掉XmlWebApplicationContext中的DEFAULT_CONFIG_LOCATION值)因为与web无关的程式 并不会经过webxml的定义档设定目前我还没试成功过XmlWebApplicationContext取得bean定义档使用 ClassPathXmlApplicationContext反而会快一些

XmlWebApplicationContext ctx = new XmlWebApplicationContext();

ctxsetConfigLocations(new String[] {/WEBINF/ applicationContextxml);

ctxsetServletContext(pageContextgetServletContext());

ctxrefresh();

UserDao userDao = (UserDao ) ctxgetBean(userDao );

利用FileSystemResource读取

Resource rs = new FileSystemResource(D:/tomcat/webapps/test/WEBINF/classes/ applicationContextxml);

BeanFactory factory = new XmlBeanFactory(rs);

UserDao userDao = (UserDao )factorygetBean(userDao);

值得注意的是利用FileSystemResource则配置文件必须放在project直接目录下或者写明绝对路径否则就会抛出找不到文件的异常

.利用FileSystemXmlApplicationContext读取

可以指定XML定义文件的相对路径或者绝对路径来读取定义文件

方法一

String[] path={WebRoot/WEBINF/applicationContextxmlWebRoot/WEBINF/applicationContext_taskxml};

ApplicationContext context = new FileSystemXmlApplicationContext(path);

方法二

String path=WebRoot/WEBINF/applicationContext*xml;

ApplicationContext context = new FileSystemXmlApplicationContext(path);

方法三

ApplicationContext ctx =

new FileSystemXmlApplicationContext(classpath:地址);

没有classpath的话就是从当前的工作目录

*******************************************************************************

** 分割一下 **

*******************************************************************************

获取Spring框架管理的类实例的方法有多种如下

方法一在初始化时保存ApplicationContext对象

代码

ApplicationContext ac = new FileSystemXmlApplicationContext(applicationContextxml);

acgetBean(beanId);

说明

这种方式适用于采用Spring框架的独立应用程序需要程序通过配置文件手工初始化Spring的情况

方法二通过Spring提供的工具类获取ApplicationContext对象

代码

import orgsprntextsupportWebApplicationContextUtils;

ApplicationContext ac =

WebApplicationContextUtilsgetRequiredWebApplicationContext(ServletContext sc)

ApplicationContext ac = WebApplicationContextUtilsgetWebApplicationContext(ServletContext

sc)

acgetBean(beanId);

acgetBean(beanId);

说明

这种方式适合于采用Spring框架的B/S系统通过ServletContext对象获取ApplicationContext对象然后

在通过它获取需要的类实例

上面两个工具方式的区别是前者在获取失败时抛出异常后者返回null

方法三继承自抽象类ApplicationObjectSupport

说明

抽象类ApplicationObjectSupport提供getApplicationContext()方法可以方便的获取到 ApplicationCont

extSpring初始化时会通过该抽象类的setApplicationContext(ApplicationContext

context)方法将ApplicationContext 对象注入

方法四继承自抽象类WebApplicationObjectSupport

说明

类似上面方法调用getWebApplicationContext()获取WebApplicationContext

方法五实现接口ApplicationContextAware

说明

实现该接口的setApplicationContext(ApplicationContext context)方法并保存ApplicationContext 对

Spring初始化时会通过该方法将ApplicationContext 对象注入

以上方法适合不同的情况请根据具体情况选用相应的方法

这里值得提一点的是系统中用到上述方法的类实际上就于Spring框架紧密耦合在一起了因为这些类是知

道它们是运行在Spring框架上的因此系统中应该尽量的减少这类应用使系统尽可能的独立于当前运

行环境尽量通过DI的方式获取需要的服务提供者

本人认为方法五比较可行可以设计一个工具类专门来获取Spring中的类减少对业务代码的侵入性

               

上一篇:Spring中加载XML文件的方式

下一篇:Spring中bean的基本xml配置