spring的bean加载.docx
《spring的bean加载.docx》由会员分享,可在线阅读,更多相关《spring的bean加载.docx(16页珍藏版)》请在冰豆网上搜索。
spring的bean加载
Spring-搞定bean加载收藏
spring的IOC灰常的强大。
。
特别是管理Web项目中的自动加载。
但是实际应用中,可能会碰到这样两类的问题:
1.写UnitTest的时候,需要脱离容器,手动读取xml文件加载bean。
2.在一个Web容器中,可能某个脱离了spring管理(也就是一个非bean)的类,需要感知并读取某个spring容易的bean。
下面转了2篇文章,分别是对应上面2个问题的解决方案。
壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹壹
Spring中读取bean配置文件的几种方式
BeanFactory允许InputStream作为构造函数的参数,也可以org.springframework.core.io.Resource接口。
下面这个例子是用ClassPathResource作为参数:
Resourceresource=newClassPathResource("bean.xml");
BeanFactoryfactory=newXmlBeanFactory(resource);
ActionBeanaction=(ActionBean)factory.getBean("actionBean");
如果同一个Bean在配置文件有多个bean的定义,则用下面的方法取得所有的对象:
Resourceresource=newClassPathResource("bean.xml");
ListableBeanFactoryfactory=newXmlBeanFactory(resource);
MaphelloBeans=factory.getBeansOfType(ActionBean.class,false,false);
一个应用程序中往往有很多的Bean要放在配置文件,如果所有的Bean都放在一个文件中,维护起来就相当的麻烦,这时我们可以按照模块把每个模块用到Bean放到不同的配置文件,Spring提供了相应的方法:
BeanDefinitionRegistryreg=newDefaultListableBeanFactory();
XmlBeanDefinitionReaderreader=newXmlBeanDefinitionReader(reg);
//載入bean定義檔
reader.loadBeanDefinitions(newClassPathResource("bean1.xml"));
reader.loadBeanDefinitions(newClassPathResource("bean2.xml"));
....
//取得Bean
BeanFactorybf=(BeanFactory)reg;
Objecto=bf.getBean("actionBean");
===================================================================
读取配置文件的几种方法
在读springinaciton时,他用的BeanFactoryfactory=newXmlBeanFactory(newFileInputStream("hello.xml"));
可是现在的用的1.2.6版本的构造器(XmlBeanFactory)只能接收Resource接口了,所以调不出来是正常的事情,假设现在有一个文件hello.xml
读取方法
1:
ApplicationContextcx=newFileSystemXmlApplicationContext("hello.xml");//指定的路径去找文件
2:
ApplicationContextfactory=newClassPathXmlApplicationContext("hello.xml");//还会在classpath去找
3:
Resourcefa=newFileSystemResource("hello.xml");
BeanFactoryfactory=newXmlBeanFactory(fa);
4:
这个要设制classpath了,麻烦
Resourceres=newClassPathResource("com/springinaction/chapter01/hello/hello.xml");
BeanFactoryfactory=newXmlBeanFactory(res);
好了,用了上面那种方法都可以调用getBean("yourbeanname")了,
eg:
BeanFactoryfactory=newXmlBeanFactory(fa);
hellohe=(hello)factory.getBean("hello");
he.getHello();
================================================================================
贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰
spring读取注册bean的一些方法(转)
我现在在做的东西,主要用到了框架是struts2+hibernate+spring开发一个上传,下载,播放视频,听歌的东西,在做到获得到注册bean的时候,我想通过在web.xml配置context-param中获得,但老也不成功,后来在网站上看到别人写的,共同分享:
通过几个项目的实践总结一下几种获得spring里注册Bean的方法:
一:
方法一(多在struts框架中)继承BaseDispatchAction
1234567891011121314151617181920212223242526272829303132333435363738394041packagecom.mas.wawacommunity.wap.web.action;
importorg.apache.struts.action.ActionForm;
importorg.apache.struts.action.ActionForward;
importorg.apache.struts.action.ActionMapping;
importorg.apache.struts.action.ActionServlet;
importorg.apache.struts.actions.DispatchAction;
importorg.springframework.web.context.WebApplicationContext;
importorg.springframework.web.context.support.WebApplicationContextUtils;
importcom.mas.wawacommunity.wap.service.UserManager;
publicclassBaseDispatchActionextendsDispatchAction{
/**
*web应用上下文环境变量
*/
protectedWebApplicationContextctx;
protectedUserManageruserMgr;
/**
*获得注册Bean
*@parambeanNameString注册Bean的名称
*@return
*/
protectedfinalObjectgetBean(StringbeanName){
returnctx.getBean(beanName);
}
protectedActionForwardunspecified(ActionMappingmapping,ActionFormform,
javax.servlet.http.HttpServletRequestrequest,
javax.servlet.http.HttpServletResponseresponse){
returnmapping.findForward("index");
}
publicvoidsetServlet(ActionServletservlet){
this.servlet=servlet;
this.ctx=WebApplicationContextUtils.getWebApplicationContext(servlet.getServletContext());
this.userMgr=(UserManager)getBean("userManager");
}
}
action调用:
123456789101112131415161718192021222324252627282930313233343536373839packagecom.mas.wawacommunity.wap.web.action;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.apache.struts.action.ActionForm;
importorg.apache.struts.action.ActionForward;
importorg.apache.struts.action.ActionMapping;
importorg.apache.struts.action.ActionServlet;
importcom.mas.wawacommunity.wap.model.News;
importcom.mas.wawacommunity.wap.service.NewsManager;
publicclassNewsActionextendsBaseDispatchAction{
NewsManagernewsManager;
publicvoidsetServlet(ActionServletservlet){
super.setServlet(servlet);
newsManager=(NewsManager)this.getBean("newsManager");
}
/**
*得到新闻列表
*@parammapping
*@paramform
*@paramrequest
*@paramresp
*@return
*/
publicActionForwardgetNewsList(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresp){
intcategory=Text.parseInt(request,"category",0);
intpageNo=Text.parseInt(request,"pageNo",1);
intpageSize=Text.parseInt(request,"pageSize",9);
PageRollpageRoll=newsManager.getAllNews(category,pageNo,pageSize);
request.setAttribute("pageRoll",pageRoll);
returnmapping.findForward("news.list");
}
}
二:
方法二实现BeanFactoryAware
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253packagemons.service;
importorg.springframework.beans.BeansException;
importorg.springframework.beans.factory.BeanFactory;
importorg.springframework.beans.factory.BeanFactoryAware;
/**
*CreatedbyIntelliJIDEA.
*User:
Weany
*Date:
2006-4-2
*Time:
2:
46:
51
*TochangethistemplateuseFile|Settings|FileTemplates.
*/
publicclassServiceLocatorimplementsBeanFactoryAware{
privatestaticBeanFactorybeanFactory=null;
privatestaticServiceLocatorservlocator=null;
publicvoidsetBeanFactory(BeanFactoryfactory)throwsBeansException{
this.beanFactory=factory;
}
publicBeanFactorygetBeanFactory(){
returnbeanFactory;
}
/**
*创建读取Bean服务类实例(从spring.xml中加载)
*
*/
publicstaticServiceLocatorgetInstance(){
if(servlocator==null)
servlocator=(ServiceLocator)beanFactory.getBean("serviceLocator");
returnservlocator;
}
/**
*根据提供的bean名称得到相应的服务类
*@paramservNamebean名称
*/
publicstaticObjectgetService(StringservName){
returnbeanFactory.getBean(servName);
}
/**
*根据提供的bean名称得到对应于指定类型的服务类
*@paramservNamebean名称
*@paramclazz返回的bean类型,若类型不匹配,将抛出异常
*/
publicstaticObjectgetService(StringservName,Classclazz){
returnbeanFactory.getBean(servName,clazz);
}
}
action调用:
1234567891011121314151617181920212223242526272829303132333435363738packagecom.anymusic.oa.webwork;
importjava.util.List;
importjava.util.Map;
importjavax.servlet.http.HttpServletRequest;
importmons.service.ServiceLocator;
importcom.anymusic.oa.hibernate.pojo.Role;
importcom.anymusic.oa.hibernate.pojo.Users;
importcom.anymusic.oa.spring.IUserService;
importcom.opensymphony.webwork.ServletActionContext;
importcom.opensymphony.xwork.Action;
importcom.opensymphony.xwork.ActionContext;
importcom.opensymphony.xwork.ModelDriven;
publicclassUserActionextendsBaseActionimplementsAction,ModelDriven{
privateUsersuser=newUsers();
protectedServiceLocatorservice=ServiceLocator.getInstance();
UserServiceuserService=(UserService)service.getService("userService");
publicStringexecute()throwsException{
returnSUCCESS;
}
publicObjectgetModel(){
returnuser;
}
publicStringgetAllUser(){
HttpServletRequestrequest=ServletActionContext.getRequest();
Listls=userService.LoadAllObject(Users.class);
request.setAttribute("user",ls);
this.setUrl("/yonghu.jsp");
returnSUCCESS;
}
}
三:
方法三实现ApplicationContextAware
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687packagemon.util;
importorg.springframework.beans.BeansException;
importorg.springframework.beans.factory.NoSuchBeanDefinitionException;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.ApplicationContextAware;
publicclassSpringContextUtilimplementsApplicationContextAware{
privatestaticApplicationContextapplicationContext;//Spring应用上下文环境
/**
*实现ApplicationContextAware接口的回调方法,设置上下文环境
*@paramapplicationContext
*@throwsBeansException
*/
publicvoidsetApplicationContext(ApplicationContextapplicationContext)throwsBeansException{
SpringContextUtil.applicationContext=applicationContext;
}
/**
*@returnApplicationContext
*/
publicstaticApplicationContextgetApplicationContext(){
returnapplicationContext;
}
/**
*获取对象
*@paramname
*@returnObject一个以所给名字注册的bean的实例
*@throwsBeansException
*/
publicstaticObjectgetBean(Stringname)throwsBeansException{
returnapplicationContext.getBean(name);
}
/**
*获取类型为requiredType的对象
*如果bean不能被类型转换,相应的异常将会被抛出(BeanNotOfRequiredTypeException)
*@paramnamebean注册名
*@paramrequiredType返回对象类型
*@returnObject返回requiredType类型对象
*@throwsBeansException
*/
publicstaticObjectgetBean(Stringname,ClassrequiredType)throwsBeansException{
returnapplicationContext.getBean(name,requiredType);
}
/**
*如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
*@paramname
*@returnboolean
*/
publicstaticbooleancontainsBean(Stringname){
returnapplicationContext.containsBean