如何获取spring boot 配置bean中配置的bean

如何从当前spring容器中获得bean? - ITeye问答
在用spring做一个web项目,有一个需求是在没有servletContext的情况下,根据beanId获得当前容器中的具体bean对象。请问如何实现?注意,这个beanId可能是外部系统传过来的,所以无法用@autowire提前注入。
发现
WebApplicationContext wac = ContextLoader.getCurrentWebApplicationC
但这个方法只能获得web容器,我想做的是获得当前的spring root container即无论当前是通过web还是非web加载的bean都能让我获得到。
如果不是web项目可以直接
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext();
然后我每次都是中这个context去取bean,但如果是web项目,该怎么做呢?
采纳的答案
写一个类,实现BeanFactoryAware接口,把该接口配置到spring中,然后把getbean方法写成静态的,就可以动态获取了。下面是示例:
public class Springfactory implements BeanFactoryAware {
private static BeanFactory beanF
// private static ApplicationC
public void setBeanFactory(BeanFactory factory) throws BeansException {
this.beanFactory =
* 根据beanName名字取得bean
* @param beanName
public static &T& T getBean(String beanName) {
if (null != beanFactory) {
return (T) beanFactory.getBean(beanName);
使用的时候,通过Springfactory.getBean("beanName"),就可以获取到bean了。注意:这个是静态方法,直接通过类名去调用。
一楼正解。
lz这个想法有点冲动了吧,
楼主难到说的是webservice传过来的beanId ,这样用ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(); 就行了。如果是web应用,注入就可以啊
实现回调接口或者实现listener都可以取得容器, 将bean缓存到map里,key是bean名称,value是对象。 取的时候从map里取就可以了
有点不明白,还请教楼主下,
既然是web项目,为什么会没有servletContext呢?
如果不是web项目部分的,通过
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext();
获取没问题的
引用ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext();
web 项目也可以这样啊!
获取的 bean 不是一个单例,但不是特殊情况下 无影响的
已解决问题
未解决问题Spring读取配置文件,获取bean的几种方式
转载地址:
方法一:在初始化时保存ApplicationContext对象
ApplicationContext ac = new
FileSystemXmlApplicationContext("applicationContext.xml");
ac.getBean("beanId");
这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况。
方法二:通过Spring提供的工具类获取ApplicationContext对象
org.springframework.web.context.support.WebApplicationContextUti
ApplicationContext ac1 =
WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext
ApplicationContext ac2 =
WebApplicationContextUtils.getWebApplicationContext(ServletContext
ac1.getBean("beanId");
ac2.getBean("beanId");
这种方式适合于采用Spring框架的B/S系统,通过ServletContext对象获取ApplicationContext对象,然后在通过它获取需要的类实例。
上面两个工具方式的区别是,前者在获取失败时抛出异常,后者返回null。
方法三:继承自抽象类ApplicationObjectSupport
抽象类ApplicationObjectSupport提供getApplicationContext()方法,可以方便的获取到ApplicationContext。Spring初始化时,会通过该抽象类的setApplicationContext(ApplicationContext
context)方法将ApplicationContext 对象注入。
方法四:继承自抽象类WebApplicationObjectSupport
类似上面方法,调用getWebApplicationContext()获取WebApplicationContext
方法五:实现接口ApplicationContextAware
实现该接口的setApplicationContext(ApplicationContext
context)方法,并保存ApplicationContext
对象。Spring初始化时,会通过该方法将ApplicationContext 对象注入。
以上方法适合不同的情况,请根据具体情况选用相应的方法。
这里值得提一点的是,系统中用到上述方法的类实际上就于Spring框架紧密耦合在一起了,因为这些类是知道它们是运行在Spring框架上的,因此,系统中,应该尽量的减少这类应用,使系统尽可能的独立于当前运行环境,尽量通过DI的方式获取需要的服务提供者。
本人认为,方法五比较可行,可以设计一个工具类,专门来获取Spring中的类。减少对业务代码的侵入性。
读取xml文件
InputStream is =
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");
这里介绍两种技术:利用spring读取properties 文件和利用java.util.Properties读取
(一)利用spring读取properties 文件
利用org.springframework.beans.factory.support.PropertiesBeanDefinitionReader来读取属性文件
构造如下config.properties文件properties代码
userDao.class=com.spring.dao.UserDao
属性文件中的"userDao"名称即是Bean的别名设定,.class用于指定类来源。
然后利用org.springframework.beans.factory.support.PropertiesBeanDefinitionReader来读取属性文件
&& BeanDefinitionRegistry reg =
new DefaultListableBeanFactory();
&& PropertiesBeanDefinitionReader
reader = new PropertiesBeanDefinitionReader(reg);
&& reader.loadBeanDefinitions(new
ClassPathResource("config.properties"));
&& BeanFactory factory =
(BeanFactory)
&& UserDao userDao =
(UserDao)factory.getBean("userDao");
(二)利用java.util.Properties读取属性文件
1.&&& String
InputStream
path=this.getServletContext().getResourceAsStream(str+"WEB-INF"+str+"classes"+str+"password.properties");
//InputStream inputStream =
this.getClass().getClassLoader().getResourceAsStream("password.properties");
Properties pros = new Properties();
&&&&&&&&&&&
pros.load(path);
} catch (IOException ex) {
&&&&&&&&&&&
//System.out.println("file is not exist");
&&&&&&&&&&&
errorMessage="资源文件不存在";
System.out.println("username:"+p.getProperty("username")+",password:"+p.getProperty("password"));
2.&&& import
org.springframework.core.io.ClassPathR
ClassPathResource cr = new
ClassPathResource("password.properties");//会重新加载spring框架
Properties pros = new Properties();
&&&&&&&&&&&
pros.load(cr.getInputStream());
} catch (IOException ex) {
&&&&&&&&&&&
//System.out.println("file is not exist");
&&&&&&&&&&&
errorMessage="资源文件不存在";
1.利用ClassPathXmlApplicationContext
可以从classpath中读取XML文件
(1) ApplicationContext context = new
ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao)context.getBean("userDao");
(2) ClassPathXmlApplicationContext resource = new
ClassPathXmlApplicationContext(new&
String[]{"applicationContext-ibatis-oracle.xml","applicationContext.xml","applicationContext-data-oracle.xml"});
BeanFactory factory =
UserDao userDao = (UserDao) factory.getBean("userDao");
2. 利用ClassPathResource
可以从classpath中读取XML文件
Resource cr = new
ClassPathResource("applicationContext.xml");
BeanFactory bf=new XmlBeanFactory(cr);
UserDao userDao = (UserDao)bf.getBean("userDao");
加载一个xml文件org.springframework.beans.factory.config.PropertyPlaceholderConfigurer不起作用
3.利用XmlWebApplicationContext读取
从Web应用程序的文件架构中,指定相对位置来读取定义文件。
XmlWebApplicationContext
的建構子無法帶參數,參考API文件會發現,預設的location會指向/WEB-INF/applicationContext.xml檔案。使用其
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
4.利用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直接目录下,或者写明绝对路径,否则就会抛出找不到文件的异常
5.利用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的话就是从当前的工作目录
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。您现在的位置:&&>>&&>>&&>>&&>>&正文
Java中如何获取Spring中配置的bean
  一、什么是Spring?
  Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架
  二、如何在程序中获取Spring配置的bean呢?
  方法一:在初始化时保存ApplicationContext对象
  代码:
ApplicationContext ac = new FileSystemXmlApplicationContex("applicationContext.xml");
&&&ac.getBean("beanId");
  ApplicationContext ac = new FileSystemXmlApplicationContex("applicationContext.xml");
  ac.getBean("beanId");说明:这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况。
  方法二:通过Spring提供的工具类获取ApplicationContext对象
  代码:&
import org.springframework.web.context.support.WebApplicationContextU
&&&&ApplicationContext ac1 = WebApplicationContextUtils
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.getRequiredWebApplicationContext(ServletContext sc)
&&&&ApplicationContext ac2 = WebApplicationContextUtils
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.getWebApplicationContext(ServletContext sc)
&&&&ac1.getBean("beanId");
&&&&ac2.getBean("beanId");
import org.springframework.web.context.support.WebApplicationContextU
&&&&ApplicationContext ac1 = WebApplicationContextUtils
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.getRequiredWebApplicationContext(ServletContext sc)
&&&&ApplicationContext ac2 = WebApplicationContextUtils
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.getWebApplicationContext(ServletContext sc)
&&&&ac1.getBean("beanId");
&&&&ac2.getBean("beanId");
  方法三:继承自抽象类ApplicationObjectSupport
  说明:抽象类ApplicationObjectSupport提供getApplicationContext()方法,可以方便的获取到ApplicationContext。Spring初始化时,会通过该抽象类的setApplicationContext(ApplicationContext context)方法将ApplicationContext 对象注入。
  方法四:继承自抽象类WebApplicationObjectSupport
  说明:类似方法三,调用getWebApplicationContext()获取WebApplicationContext
  方法五:实现接口ApplicationContextAware
  说明:实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对象。Spring初始化时,会通过该方法将ApplicationContext 对象注入。
【责编:ivy】
?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]
相关产品和培训
 友情推荐链接
 认证培训
 专题推荐
 ? ? ? ? ? ? ? ? ? ?
 今日更新
?&?&?&?&?&?&?&?&?&?&
 社区讨论
 博客论点
 频道精选
 Java 频道导航spring 容器外的实例如何得到spring中的bean?? - ITeye问答
WebApplicationContextUtils. getWebApplicationContext(servletContext).getBean(beanName);???这个貌似不行,是不是因为实例没有在spring中注册,所以得不到servletContex?
由于用到了WebApplicationContext,你在web.xml里面需要写
&context-param&
&param-name&contextConfigLocation&/param-name&
&param-value&classpath:/applicationContext.xml&/param-value&
&/context-param&
&listener&
&listener-class&org.springframework.web.context.ContextLoaderListener&/listener-class&
&/listener&
[color=red]&listener&
&listener-class&org.springframework.web.context.request.RequestContextListener&/listener-class&
&/listener&[/color]
红色这段要加上
在web.xml配置
&context-param&
&param-name&contextConfigLocation&/param-name&
&param-value&classpath:/applicationContext.xml&/param-value&
&/context-param&
&listener&
&listener-class&org.springframework.web.context.ContextLoaderListener&/listener-class&
&/listener&
下面是在struts1.x Action中的用法
WebApplicationContextUtils.getWebApplicationContext(getServlet().getServletContext()).getBean("userService");
配置见楼上, 但是这个方法要拿到servletContext才有用哦!
使用监听器加载spring配置文件
&context-param&
&param-name&contextConfigLocation&/param-name&
&param-value&classpath:/applicationContext.xml&/param-value&
&/context-param&
&listener&
&listener-class&org.springframework.web.context.ContextLoaderListener&/listener-class&
&/listener&
使用WebApplicationContextUtils.getWebApplicationContext(servletContext).getBean("beanName");可以过去到bean实例
这个是要你在web.xml文件中配置一个listener或servlet启动时加载spring的bean后,才能用WebApplicationContextUtils. getWebApplicationContext(servletContext).getBean(beanName);得到它的bean
已解决问题
未解决问题问说网手机版
躺着 站着 跪着轻松访问
问说网 / 蜀ICP备号
感谢您对问说网的支持,提出您在使用过程中遇到的问题或宝贵建议,您的反馈对我们产品的完善有很大帮助。
您的反馈我们已收到!
感谢您提供的宝贵意见,我们会在1-2个工作日,通过您留下的联系方式将处理结果反馈给您!}

我要回帖

更多关于 spring mvc 获取bean 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信