spring boot 配置bean被引用的bean可以在后面配置吗

  最近在做项目的时候我发现一个问题:Spring的IOC容器不能在Web中被引用(或者说不能被任意地引用)。我们在配置文件中让Spring自动装配,但并没有留住ApplicationContext的实例。我们如果希望在我们的项目中任何位置都能拿到同一个ApplicationContext来获取IOC容器中的资源,就要让Spring将上下文环境填充到我们能获取的地方,比如下面的做法(来自网络资源):
  自定义一个工具类,实现自ApplicationContextAware接口,接口的方法是setApplicationContext,我们实现它,并让其为我们服务,因为Spring在load自己的时候会将上下文环境填充进来。我们所要做的就是将得到的ApplicationContext保存下来用。
1 package org.coderecord.ccms.web.action.
3 import org.springframework.beans.BeansE
4 import org.springframework.context.ApplicationC
5 import org.springframework.context.ApplicationContextA
* Spring IOC上下文工具类
* @author Ryan Shaw
13 public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationC
* 设置当前上下文环境,此方法由spring自动装配
public void setApplicationContext(ApplicationContext arg0)
throws BeansException {
applicationContext = arg0;
* 从当前IOC获取bean
* @param id
public static Object getObject(String id) {
Object object = null;
object = applicationContext.getBean(id);
  上文的类就是我们要用的,而其中的setApplicationContext是接口中需要实现的,Spring会自动进行填充。我们在Spring的配置文件中注册一下:
1 &bean id="springUtil" class="org.coderecord.ccms.web.action.util.SpringUtil" /&
  这样就可以了,Spring把我们需要的东西给我们了。
  我们就可以在需要的地方这样做:
1 YouClass obj = (YouClass)SpringUtil.getObject("beanid");
  当然,前提是你需要让Spring自动装配哦。
  以下为方法二,使用了注解和静态化的方式来产生SpringFactory对象
  来自网络资源,修改于 15:25:57&
  上文的方法有个麻烦的地方:需要配置。而Spring2.5及之后的版本实际上加入了注解的方式进行依赖项的注入,使用如下代码也许更好:
1 package org.ahe.
3 import org.springframework.beans.factory.BeanF
4 import org.springframework.beans.factory.annotation.A
5 import org.springframework.web.context.support.SpringBeanAutowiringS
7 public class SpringWiredBean extends SpringBeanAutowiringSupport {
* 自动装配注解会让Spring通过类型匹配为beanFactory注入示例
@Autowired
private BeanFactory beanF
private SpringWiredBean() {
private static SpringWiredB
// 静态块,初始化实例
instance = new SpringWiredBean();
* 实例方法
* 使用的时候先通过getInstance方法获取实例
* @param beanId
public Object getBeanById(String beanId) {
return beanFactory.getBean(beanId);
public static SpringWiredBean getInstance() {
  如果使用@Autowired注解自动装配的话,继承SpringBeanAutowiringSupport类是不能少的。当然,使用@Component等注解也是可以的。使用注解的话配置就需要改动了,不过因为我们为支持Spring注解的配置是可以多用的,所以还好。如下:
1 &context:component-scan base-package="org.ahe"&&/context:component-scan&
  该配置即可让org.ahe下所有包(您依然可以通过子标签的正则表达式匹配来进行更多设置)下的注解起作用。
&欢迎您移步我们的交流群,无聊的时候大家一起打发时间:
&或者通过QQ与我联系:
&    (最后编辑时间 16:59:45)
阅读(...) 评论()Spring中多配置文件以及寻觅引用其他bean的方式 - 编程当前位置:& &&&Spring中多配置文件以及寻觅引用其他bean的方式Spring中多配置文件以及寻觅引用其他bean的方式&&网友分享于:&&浏览:343次Spring中多配置文件以及寻找引用其他bean的方式
  Spring多配置文件有什么好处?直接写在一个配置文件里不就完了么?而且多配置文件不是会增加读取配置文件的开销么?其实我当我第一次碰到这些我也有这些问题,但在公司实习的一段时间我看到了它的一些优点,下面说下我自己的看法:
首先,如果一直把眼光停留在小工程小项目的层次上是无法理解这其中的好处,在企业级的项目中,Spring的配置文件中是会有很多东西的,所以这是其中一点:按照目的、功能去拆分配置文件,可以提高配置文件的可读性与维护性,如将配置事务管理、数据源等少改动的配置与配置bean单独分开。当我们是团队开发的时候,每个人虽然都负责自己的模块,但使用Spring如果只是一个配置文件,那么我们的工作经常会有交集,其中一个交集就是在Spring配置文件中增加自己的bean,这样会给团队开发带来一定的不便,所以bean配置文件又可以被分成多个配置文件,最终在一个配置文件中将所有import进来,这是另外一点。
Spring读取配置文件的几种方式:
1、使用Spring自身提供的ApplicationContext方式读取
在Java程序中可以使用ApplicationContext两个实现类ClassPathXmlApplicationContext以及
FileSystemXmlApplicationContext来读取多个配置文件,他们的构造器都可以接收一个配置文件数组
ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocations);与采用FileSystemXmlApplicationContext创建ApplicationContext的方式相似,区别仅在于二者搜索配置文件的路径不同:ClassPathXmlApplicationContext通过CLASSPATH路径搜索配置文件:而
FileSystemXmlApplicationContext则在当前路径搜索配置文件。
2、使用web工程启动时加载
在web.xml中配置web容器启动是自动加载哪些配置文件:
&servlet-name&app&/servlet-name&
&servlet-class&
org.springframework.web.servlet.DispatcherServlet
&/servlet-class&
&context-param&
&param-name&contextConfigLocation&/param-name&
&param-value&/WEB-INF/applicationContext*.xml,/WEB-
INF/user_spring.xml&/param-value&
&/context-param&
&load-on-startup&1&/load-on-startup&
&/servlet&
3、Xml配置文件中导入其他配置文件
在/WEB-INF/applicationContext.xml配置应用服务去加载,可以在applicationContext.xml中用import引入其他的配置文件
&?xml version="1.0" encod工口g="gb2312"?&
&!一指定Spring 配置文件的dtd&
&!DOCTYPE beans PUBLIC "-IISPR工NGIIDTD BEANIIEN"
''http://www.springframework.org/dtd/spring-beans.dtd''&
&!-- Spring 配置文件的根元素-&
&!--导入hibernate的配置文件 --&
&import resource="com/demo/res/hibernate.xml"/&
&!--导入多个bean配置文件 --&
&import resource="com/demo/res/bean1.xml"/&
&import resource="com/demo/res/bean2.xml"/&
&!-- 下面也可以再定义该文件的其他bean --〉
&bean id="bean1" class=". .."&
&bean id="bean2" class="..."&
然后再说一下引用其他bean即ref的一些属性,在多配置文件上也会用到:
指定了属性对BeanFactory中其他Bean的引用关系。
bean属性:指定了属性对BeanFactory中其他Bean的引用关系,它可以跨xml寻找bean,多个配置文件中,有时会用到其他配置文件里的bean。
local属性:指定了属性对BeanFactory中其他Bean的引用关系,但仅在本地(同一个)xml文件里寻找对应的bean,如果我们确定引用的bean只会存在当前的配置文件中,使用该属性的话相对来说会快一些。
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有2016年8月 扩充话题大版内专家分月排行榜第二
2015年8月 Java大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。java spring 配置文件中定义list引用一个已存在的bean - 为程序员服务
为程序员服务
spring 配置文件中定义list引用一个已存在的bean
我们知道在spring中可以用如下方法来定义一个list:
&property name=&lists&&
&value&1&/value&
&bean class=&mon.Person&&
&property name=&name& value=&mkyongList& /&
&property name=&address& value=&address& /&
&property name=&age& value=&28& /&
&/property&
如果要在list中引用一个已经在spring中定义过的bean可以使用ref节点,如下所示:
&property name=&lists&&
&ref bean=&PersonBean& /&
&bean class=&mon.Person&&
&property name=&name& value=&mkyongList& /&
&property name=&address& value=&address& /&
&property name=&age& value=&28& /&
&/property&
上面的PersonBean是一个已经在spring配置文件中定义过的bean
您可能的代码
相关聚客文章
荣誉:2086
相关专栏文章6132人阅读
【架构设计】-----框架探索(64)
前一篇博客介绍了Spring中的Bean的基本概念和作用域(),现在介绍Spring Bean的基本配置。
从开始我们知道Java应用中各组件的相互调用的实质可以归纳为依赖关系。根据注入方式的不同,Bean的依赖注入可以分为两种形式:
1、& 属性:通过&property …/&元素配置,对应设置注入。
2、& 构造器参数:通过&constructor-arg…/&元素配置,对应构造注入。
不管是属性,还是构造器参数,都视为Bean的依赖,接受Spring容器管理,依赖关系的值要么是一个确定的值,要么是Spring容器中的其他Bean的引用。
在一般情况下,我是不应该在配置文件中管理普通属性的引用,通常只是用配置文件管理容器中的Bean实例的依赖关系。
Spring在实例化容器时,会校验BeanFactory中每一个Bean的配置。这些校验包括:
Bean引用的依赖Bean是否指向一个合法的Bean。
Bean的普通属性值是否获得一个有效值。
&&&&&&& 对于singleton作用域的Bean,如果没有强行取消其预初始化的行为,系统会在创建Spring容器时预初始化所用singleton
Bean,与此同时,该Bean所依赖的Bean也被一起实例化。
BeanFactory与ApplicationContext实例化容器中的Bean的时机也是不同的:BeanFactory等到程序需要Bean实例时才创建Bean,而ApplicationContext是在创建ApplicationContext实例时,会预初始化容器中的全部Bean。同时在创建BeanFactory时不会立即创建Bean实例,所以有可能程序可以正确地创建BeanFactory实例,但是当请求Bean实例时依然抛出一个异常:创建Bean实例或注入它的依赖关系时出现错误。所以当配置错误的延迟出现,会给系统带来一些不安全的因素。而ApplicationContext则是默认预初始化所有singleton作用域的Bean,所以ApplicationContext实例化过程比BeanFactory实例化过程的时间和内存开销大,但是一旦创建成功,应用后面的响应速度会非常快,同时可以检验出配置错误,故一般都是推荐使用ApplicationContext作为Spring容器。
&&&&&&&&&&
其实我们可以指定lazy-int=”true”来强制取消singleton作用域的Bean的预初始。这样该Bean就不会随着ApplicationContext启动而预实例化了。
Spring可以为任何java对象注入任何类型的属性,只要改java对象为该属性提供了对应的setter方法即可。
&bean id=&person& class=&lee.Person&&
&!-- Property配置需要依赖注入的属性 --&
&property name=&name& value=&chenming& /&
&property name=&age& value=&22& /&
Spring会为&bean…/&元素创建一个java对象,一个这样的java对象对应一个Bean实例,对于如上代码,Spring会采用如下形式来创建Java实例。
//获取lee.Person类的Class对象
personClass = Class.forName(&lee.Person&);
//创建lee.Person类的默认实例
Object personBean = personBean.newInStance();
创建该实例后,Spring就会遍历该&bean../&元素的所有&property…/&子元素。&bean…/&元素每包含一个&property…/&子元素,Spring就会为该Bean实例调用一次setter方法。类似于下面程序:
//获取name属性的setter方法
String setName = &set&+&Name&;
//获取lee.Person类里面的Set()Name方法
java.lang.reflect.Method setMethod = personClass.getMethod(setName, aVal.getClass());
//调用Bean实例的SetName()方法
setMethod.invoke(personBean, aVal);
对于使用&constructor-arg…/&元素来指定构造器注入,Spring不会采用默认的构造器来创建Bean实例,而是使用特定的构造器来创建该Bean实例。
&bean id=&person& class=&lee.Person&&
&constructor-arg index=&0& value=&aVal& /&
&constructor-arg index=&1& value=&bVal& /&
针对上面的代码,Spring会采用类似如下的代码来创建Bean实例:
//获取lee.Person类的class对象
personClass = Class.forName(&lee.Person&);
//获取第一个参数是aVal类型,第二个参数是bVal类型的构造器
Constructor personCtr = personClass.getConstructor(aVal.getClass(),bVal.getClass());
//以指定构造器创建Bean实例
Object bean = personCtr.newInstance(aVal,bVal);
&&&&&&&&& 上面的程序只是一个实例,实际上Spring还需要根据&property…/&元素、&contructor-arg../&元素所使用value属性,ref属性等来判断需要注入的到底是什么数据类型,并要对这些值进行合适的类型转换,所以Spring的实际处理过程会更加复杂。
&&&&&&&&&&& 读李刚《轻量级Java EE企业应用实战》
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2043142次
积分:18181
积分:18181
排名:第421名
原创:240篇
评论:1358条
文章:18篇
阅读:28104
文章:19篇
阅读:57880
阅读:77864
文章:36篇
阅读:665670
文章:22篇
阅读:110113
文章:55篇
阅读:319851
(1)(4)(7)(6)(1)(1)(3)(1)(6)(4)(1)(2)(5)(1)(1)(1)(11)(2)(6)(3)(2)(5)(2)(10)(4)(3)(12)(8)(4)(7)(2)(7)(11)(3)(3)(9)(7)(3)(5)(4)(16)(2)(4)(6)(20)(12)(1)(2)(1)(1)(1)

我要回帖

更多关于 spring bean 配置 的文章

 

随机推荐