spring 几种获得bean的方法
spring 几种获得bean的方法
几种获得spring里注册Bean的方法
获得spring里注册Bean的四种方法,特别是第三种方法,简单: 一:方法一(多在struts框架中)继承BaseDispatchAction
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");
}
}二:方法二实现BeanFactoryAware
一定要在spring.xml中加上:
<beanid="serviceLocator"class="com.am.oa.commons.service.ServiceLocator"singleton="true"/>
当对serviceLocator实例时就自动设置BeanFactory,以便后来可直接用beanFactorypublicclassServiceLocatorimplementsBeanFactoryAware{
privatestaticBeanFactorybeanFactory=null;
privatestaticServiceLocatorservlocator=null;
publicvoidsetBeanFactory(BeanFactoryfactory)throwsBeansException{
this.beanFactory=factory;
}
publicBeanFactorygetBeanFactory(){
returnbeanFactory;
}
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调用:
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
一定要在spring.xml中加上:
<beanid="SpringContextUtil"class="com.am.oa.commons.service.SpringContextUtil"singleton="true"/>
当对SpringContextUtil 实例时就自动设置applicationContext,以便后来可直接用applicationContextpublicclassSpringContextUtilimplementsApplicationContextAware{
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(name);
}
/**
*判断以给定名字注册的bean定义是一个singleton还是一个prototype。
*如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
*@paramname
*@returnboolean
*@throwsNoSuchBeanDefinitionException
*/
publicstaticbooleanisSingleton(Stringname)throwsNoSuchBeanDefinitionException{
returnapplicationContext.isSingleton(name);
}
/**
*@paramname
*@returnClass注册对象的类型
*@throwsNoSuchBeanDefinitionException
*/
publicstaticClassgetType(Stringname)throwsNoSuchBeanDefinitionException{
returnapplicationContext.getType(name);
}
/**
*如果给定的bean名字在bean定义中有别名,则返回这些别名
*@paramname
*@return
*@throwsNoSuchBeanDefinitionException
*/
publicstaticString[]getAliases(Stringname)throwsNoSuchBeanDefinitionException{
returnapplicationContext.getAliases(name);
}
}action调用:
packagecom.anymusic.oa.webwork;
importjava.util.List;
importjava.util.Map;
importjavax.servlet.http.HttpServletRequest;
importcom.anymusic.oa.commons.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();
//不用再加载springContext.xml文件,因为在web.xml中配置了,在程序中启动是就有了.
UserServiceuserService=(UserService)SpringContextUtil.getBean("userService");
publicStringexecute()throwsException{
returnSUCCESS;
}
publicObjectgetModel(){
returnuser;
}
publicStringgetAllUser(){
HttpServletRequestrequest=ServletActionContext.getRequest();
Listls=userService.LoadAllObject(Users.class);
request.setAttribute("user",ls);
this.setUrl("/yonghu.jsp");
returnSUCCESS;
}
}四.通过servlet 或listener设置spring的ApplicationContext,以便后来引用.
注意分别extendsContextLoaderListener和ContextLoaderServlet.然后就可用SpringContext来getBean.
覆盖原来在web.xml中配置的listener或servlet.public class SpringContext { private static ApplicationContext applicationContext; //Spring应用上下文环境
*/
publicvoidsetApplicationContext(ApplicationContextapplicationContext)throwsBeansException{
SpringContextUtil.applicationContext=applicationContext;
}
/**
*@returnApplicationContext
*/
publicstaticApplicationContextgetApplicationContext(){
returnapplicationContext;
}*/
publicstaticObjectgetBean(Stringname)throwsBeansException{
returnapplicationContext.getBean(name);
}}
public class SpringContextLoaderListener extends ContextLoaderListener{ //
publicvoidcontextInitialized(ServletContextEventevent){
super.contextInitialized(event);
SpringContext.setApplicationContext(
WebApplicationContextUtils.getWebApplicationContext(event.getServletContext())
);
}
}public class SpringContextLoaderServlet extends ContextLoaderServlet {
privateContextLoadercontextLoader;
publicvoidinit()throwsServletException{
this.contextLoader=createContextLoader();
SpringContext.setApplicationContext(this.contextLoader.initWebApplicationContext(getServletContext()));
}
}