如何通过代码直接获得Spring容器中的Bean

如何通过代码直接获得Spring容器中的Bean,第1张

<bean id="springBean" scope="prototype" class=""<property name="name" value="chen"/</bean<bean id="myAction" scope="prototype" class=""<property name="springBean" ref="springBean"/</bean如果是j2ee应用,启动web应用时将会自动加载ApplicationContext实例(Spring容器负责创建Bean实例)一旦struts2的myAction实例化,其中的SpringBean也会被自动注入进来,从而达到使用SpringBean的目的。[问题]但是仍有需要通过代码来调用SpringBean的情况:1)对于不是由spring创建管理的类,如在java 代码中直接使用new去创建一个对象,并且想在这个对象中使用SpringBean;因为这个对象并不是由Spring容器创建管理的类,所以即使它有setter方法,容器的springBean也不会被注入。2)动态更改springBean中的属性值,如在代码运行时,name值需要发生变动;3)对于一个独立的应用程序[解决]定义一个非Spring容器创建管理的类public class NonSpringClass implements ServletContextAware {private SpringBean springBean;//如果 testGetBean不是被Spring容器创建管理,即使它有setter方法,容器的springBean也不会被注入。public void setSpringBean(SpringBean springBean){thisspringBean=springBean;}//利用ApplicationContext 从spring容器中获得springBean;//Spring有两个核心接口BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口,//它们代表了Spring容器,Spring容器是产生Bean的工厂,用于管理容器中的Bean。

读取xml文件

/

利用XmlBeanFactory(Resource resource)

这里Resource必须是xml格式

Resource包括 AbstractResource ClassPathResource FileSystemResource

InputStreamResource ServletContextResource UrlResource

/

/

利用 InputStreamResource(InputStream inputStream)

要将applicationContext xml放在项目根目录下

/

InputStream is = null;

try {

is = new FileInputStream( applicationContext xml );

} catch (FileNotFoundException e) {

e printStackTrace();

}

Resource resource = new InputStreamResource(is);

BeanFactory factory = new XmlBeanFactory(resource);

UserDao userDao = (UserDao)factory getBean( userDao );

/

利用 Properties

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

/

具体见

利用ClassPathXmlApplicationContext

可以从classpath中读取XML文件

( ) ApplicationContext context = new ClassPathXmlApplicationContext( applicationContext xml );

UserDao userDao = (UserDao)context getBean( userDao );

( ) ClassPathXmlApplicationContext resource = new ClassPathXmlApplicationContext(new  String[]{ applicationContext ibatis oracle xml applicationContext xml applicationContext data oracle xml });

BeanFactory factory = resource;

UserDao userDao = (UserDao) factory getBean( userDao );

利用ClassPathResource

可以从classpath中读取XML文件

Resource cr = new ClassPathResource( applicationContext xml );

BeanFactory bf=new XmlBeanFactory(cr);

UserDao userDao = (UserDao)bf getBean( userDao );

加载一个xml文件 springframewonfig PropertyPlaceholderConfigurer不起作用

.利用XmlWebApplicationContext读取

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

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

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

XmlWebApplicationContext ctx = new XmlWebApplicationContext();

ctx setConfigLocations(new String[] { /WEB INF/ applicationContext xml );

ctx setServletContext(pageContext getServletContext());

ctx refresh();

UserDao  userDao = (UserDao ) ctx getBean( userDao );

利用FileSystemResource读取

Resource rs = new FileSystemResource( D:/tomcat/webapps/test/WEB INF/classes/ applicationContext xml );

BeanFactory factory = new XmlBeanFactory(rs);

UserDao  userDao  = (UserDao )factory getBean( userDao );

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

.利用FileSystemXmlApplicationContext读取

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

方法一

String[]   path={ WebRoot/WEB INF/applicationContext xml WebRoot/WEB INF/applicationContext_task xml };

ApplicationContext context = new FileSystemXmlApplicationContext(path);

方法二

String path= WebRoot/WEB INF/applicationContext xml ;

ApplicationContext context = new FileSystemXmlApplicationContext(path);

方法三

ApplicationContext ctx =

new FileSystemXmlApplicationContext( classpath:地址 );

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

         分割一下                                                                                                           

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

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

代码

ApplicationContext ac = new FileSystemXmlApplicationContext( applicationContext xml );

ac getBean( beanId );

说明

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

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

代码

import sprntext support WebApplicationContextUtils;

ApplicationContext ac =

WebApplicationContextUtils getRequiredWebApplicationContext(ServletContext sc)

ApplicationContext ac = WebApplicationContextUtils getWebApplicationContext(ServletContext

sc)

ac getBean( beanId );

ac getBean( beanId );

说明

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

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

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

方法三 继承自抽象类ApplicationObjectSupport

说明

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

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

context)方法将ApplicationContext 对象注入

方法四 继承自抽象类WebApplicationObjectSupport

说明

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

方法五 实现接口ApplicationContextAware

说明

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

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

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

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

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

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

lishixinzhi/Article/program/Java/ky/201311/28302

以上就是关于如何通过代码直接获得Spring容器中的Bean全部的内容,包括:如何通过代码直接获得Spring容器中的Bean、spring中读取xml配置文件、获取bean、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9743959.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存