`

Web开发中获取Spring的ApplicationContext的几种方式

 
阅读更多

在 WEB 开发中,获取到由 Spring 进行管理的某些 Bean,通常采用下面方式来获取

1、通过set注入方式

private ProjectStageHandler projectStageHandler;

public void setProjectStageHandler(ProjectStageHandler projectStageHandler) {
  this.projectStageHandler = projectStageHandler;
 }

2、通过注解方式

@Resource

private ProjectStageHandler projectStageHandler;

今天遇到 需要显示的获得 ApplicationContext 来得到由 Spring 进行管理的某些 Bean,在这里和大家分享一下,WEB 开发中,怎么获取 ApplicationContext ( 如有不正确之处还请指点)

查找工程有没有这种实现,功夫没有白费还真找到了大致实现方式如下:

3、首先web.xml配置

<listener>
    	<listener-class>org.common.xxxServletContextListener</listener-class>
    </listener>

接着xxxServletContextListener.java

public class xxxServletContextListener implements ServletContextListener {    
    //ServletContext创建时调用该方法 
	public void contextInitialized(ServletContextEvent arg0){
		ServletContext context= arg0.getServletContext();   
		System.out.println("监听器启动。。。。。。。。。。。。。。。。。。。。。。。。。。。。");
		ApplicationCtx.init(context);
	}  
    //ServletContext销毁时调用该方法    
    public void contextDestroyed(ServletContextEvent sce){    
         System.out.println("ServletContext销毁");    
     }
	  
}   

ApplicationCtx .java

public class ApplicationCtx {

	public static ApplicationContext ctx;
	
	public static ApplicationContext getCtx(){
		return ctx;
	}
	public static void init(ServletContext sc){
		if(ctx==null){
			ctx =  WebApplicationContextUtils.getRequiredWebApplicationContext(sc);
		}
	}
}

通过 ApplicationCtx.getCtx().getBean("xxx"); 就可以获到想要的bean啦

想想这种方式有点太罗嗦和麻烦,还有没有更简单的方式哪?有当然有。

4、首先要在spring.xml中加上

<bean id="applicationContext" class="org.wy.util.AppliactionContextHelper"/>

当对AppliactionContextHelper实例时就自动设置applicationContext,以便后来可直接用applicationContext

 
public class AppliactionContextHelper implements ApplicationContextAware {
  private static ApplicationContext applicationContext;     //Spring应用上下文环境
 
  /**
  * 实现ApplicationContextAware接口的回调方法,设置上下文环境  
  * @param applicationContext
  * @throws BeansException
  */
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    AppliactionContextHelper.applicationContext = applicationContext;
  }
 
  /**
  * @return ApplicationContext
  */
  public static ApplicationContext getApplicationContext() {
    return applicationContext;
  }
 
  /**
  * 获取对象  
  * @param name
  * @return Object 一个以所给名字注册的bean的实例
  * @throws BeansException
  */
  public static Object getBean(String name) throws BeansException {
    return applicationContext.getBean(name);
  }
 
  /**
  * 获取类型为requiredType的对象
  * 如果bean不能被类型转换,相应的异常将会被抛出(BeanNotOfRequiredTypeException)
  * @param name       bean注册名
  * @param requiredType 返回对象类型
  * @return Object 返回requiredType类型对象
  * @throws BeansException
  */
  public static Object getBean(String name, Class requiredType) throws BeansException {
    return applicationContext.getBean(name, requiredType);
  }
 
  /**
  * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
  * @param name
  * @return boolean
  */
  public static boolean containsBean(String name) {
    return applicationContext.containsBean(name);
  }
 
  /**
  * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。
  * 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)  
  * @param name
  * @return boolean
  * @throws NoSuchBeanDefinitionException
  */
  public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
    return applicationContext.isSingleton(name);
  }
 
  /**
  * @param name
  * @return Class 注册对象的类型
  * @throws NoSuchBeanDefinitionException
  */
  public static Class getType(String name) throws NoSuchBeanDefinitionException {
    return applicationContext.getType(name);
  }
 
  /**
  * 如果给定的bean名字在bean定义中有别名,则返回这些别名  
  * @param name
  * @return
  * @throws NoSuchBeanDefinitionException
  */
  public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
    return applicationContext.getAliases(name);
  }
}

通过AppliactionContextHelper.getBean("xxx");就可以获到想要的bean啦

5、

利用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 = resource;

factory.getBean("xxx");

这种方式只适合非web中的应用程序中。

--------------------------------------------------------------------------------------------------------------------------------

转载:

获得spring里注册Bean的四种方法,特别是第三种方法,简单:


一:方法一(多在struts框架中)继承BaseDispatchAction

Java代码 复制代码 收藏代码
 
import com.mas.wawacommunity.wap.service.UserManager;
 
public class BaseDispatchAction extends DispatchAction {
    /**
    * web应用上下文环境变量
    */
    protected WebApplicationContext ctx;
 
    protected UserManager userMgr;
 
    /**
    * 获得注册Bean    
    * @param beanName String 注册Bean的名称
    * @return
    */
    protected final Object getBean(String beanName) {
        return ctx.getBean(beanName);
    }
 
    protected ActionForward unspecified(ActionMapping mapping, ActionForm form,
              javax.servlet.http.HttpServletRequest request,
              javax.servlet.http.HttpServletResponse response) {    
        return mapping.findForward("index");
    }
 
    public void setServlet(ActionServlet servlet) {
        this.servlet = servlet;
        this.ctx = WebApplicationContextUtils.getWebApplicationContext(servlet.getServletContext());
        this.userMgr = (UserManager) getBean("userManager");
    }        
}


二:方法二实现BeanFactoryAware
一定要在spring.xml中加上:
Xml代码 复制代码 收藏代码

<bean id="serviceLocator" class="com.am.oa.commons.service.ServiceLocator" singleton="true" />

当对serviceLocator实例时就自动设置BeanFactory,以便后来可直接用 beanFactory
Java代码 复制代码 收藏代码
public class UserAction extends BaseAction implements Action,ModelDriven{
   
    private Users user = new Users();
    protected ServiceLocator service = ServiceLocator.getInstance();
    UserService userService = (UserService)service.getService("userService");
 
    public String execute() throws Exception {        
        return SUCCESS;
    }
 
  public Object getModel() {
        return user;
    }    
   
    public String getAllUser(){
        HttpServletRequest request = ServletActionContext.getRequest();        
        List ls=userService.LoadAllObject( Users.class );
        request.setAttribute("user",ls);    
        this.setUrl("/yonghu.jsp");
        return SUCCESS;
    }
}



三:方法三实现ApplicationContextAware,一定要在spring.xml中加上:
Xml代码 复制代码 收藏代码
<bean id="SpringContextUtil " class="com.am.oa.commons.service.SpringContextUtil " singleton="true" />

当对SpringContextUtil 实例时就自动设置applicationContext,以便后来可直接用applicationContext
Java代码 复制代码 收藏代码
 
public class SpringContextUtil implements ApplicationContextAware {
  private static ApplicationContext applicationContext;     //Spring应用上下文环境
 
  /**
  * 实现ApplicationContextAware接口的回调方法,设置上下文环境  
  * @param applicationContext
  * @throws BeansException
  */
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    SpringContextUtil.applicationContext = applicationContext;
  }
 
  /**
  * @return ApplicationContext
  */
  public static ApplicationContext getApplicationContext() {
    return applicationContext;
  }
 
  /**
  * 获取对象  
  * @param name
  * @return Object 一个以所给名字注册的bean的实例
  * @throws BeansException
  */
  public static Object getBean(String name) throws BeansException {
    return applicationContext.getBean(name);
  }
 
  /**
  * 获取类型为requiredType的对象
  * 如果bean不能被类型转换,相应的异常将会被抛出(BeanNotOfRequiredTypeException)
  * @param name       bean注册名
  * @param requiredType 返回对象类型
  * @return Object 返回requiredType类型对象
  * @throws BeansException
  */
  public static Object getBean(String name, Class requiredType) throws BeansException {
    return applicationContext.getBean(name, requiredType);
  }
 
  /**
  * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
  * @param name
  * @return boolean
  */
  public static boolean containsBean(String name) {
    return applicationContext.containsBean(name);
  }
 
  /**
  * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。
  * 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)  
  * @param name
  * @return boolean
  * @throws NoSuchBeanDefinitionException
  */
  public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
    return applicationContext.isSingleton(name);
  }
 
  /**
  * @param name
  * @return Class 注册对象的类型
  * @throws NoSuchBeanDefinitionException
  */
  public static Class getType(String name) throws NoSuchBeanDefinitionException {
    return applicationContext.getType(name);
  }
 
  /**
  * 如果给定的bean名字在bean定义中有别名,则返回这些别名  
  * @param name
  * @return
  * @throws NoSuchBeanDefinitionException
  */
  public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
    return applicationContext.getAliases(name);
  }
}


action调用:
Java代码 复制代码 收藏代码
package com.anymusic.oa.webwork;
 
import java.util.List;
import java.util.Map;
 
import javax.servlet.http.HttpServletRequest;
 
import com.anymusic.oa.commons.service.ServiceLocator;
import com.anymusic.oa.hibernate.pojo.Role;
import com.anymusic.oa.hibernate.pojo.Users;
import com.anymusic.oa.spring.IUserService;
import com.opensymphony.webwork.ServletActionContext;
import com.opensymphony.xwork.Action;
import com.opensymphony.xwork.ActionContext;
import com.opensymphony.xwork.ModelDriven;
 
public class UserAction extends BaseAction implements Action,ModelDriven{
   
    private Users user = new Users();
 //不用再加载springContext.xml 文件,因为在web.xml中配置了,在程序中启动是就有了.   
    UserService userService = (UserService) SpringContextUtil.getBean("userService");
   
    public String execute() throws Exception {        
        return SUCCESS;
    }
 
  public Object getModel() {
        return user;
    }    
   
    public String getAllUser(){
        HttpServletRequest request = ServletActionContext.getRequest();        
        List ls=userService.LoadAllObject( Users.class );
        request.setAttribute("user",ls);    
        this.setUrl("/yonghu.jsp");
        return SUCCESS;
    }
}

四.通过servlet 或listener设置spring的 ApplicationContext,以便后来引用.
注意分别extends ContextLoaderListener和ContextLoaderServlet .然后就可用SpringContext 来getBean.
覆盖原来在web.xml中配置的listener或servlet.
public class SpringContext  {   
  private static ApplicationContext applicationContext;     //Spring应用上下文环境   
    
  
  */   
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {   
    SpringContextUtil.applicationContext = applicationContext;   
  }   
    
  /**  
  * @return ApplicationContext  
  */  
  public static ApplicationContext getApplicationContext() {   
    return applicationContext;   
  }   
    
  
  */   
  public static Object getBean(String name) throws BeansException {   
    return applicationContext.getBean(name);   
  }   
  
}   
  
public class SpringContextLoaderListener extends ContextLoaderListener{  //   
 public void contextInitialized(ServletContextEvent event) {     
  super.contextInitialized(event);   
  SpringContext.setApplicationContext(   
    WebApplicationContextUtils.getWebApplicationContext(event.getServletContext())   
    );   
 }   
}   
  
public class SpringContextLoaderServlet extends ContextLoaderServlet {   
 private ContextLoader contextLoader;   
    public void init() throws ServletException {   
        this.contextLoader = createContextLoader();   
        SpringContext.setApplicationContext(this.contextLoader.initWebApplicationContext(getServletContext()));   
    }   
}  
分享到:
评论

相关推荐

    Spring获取webapplicationcontext,applicationcontext几种方法详解

    在独立应用程序中,通过手工初始化 Spring 容器,可以使用以下方式获取 ApplicationContext 对象: `ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");` `ac.getBean("bean...

    在Web项目中集成Spring

    但不论使用哪种方式,理解Spring在Web项目中的集成原理和组件工作方式都是非常重要的。 总之,Spring为Web开发提供了强大而灵活的框架,通过合理集成和配置,可以构建出高效、可维护的Web应用。

    获取spring容器的方法

    本文将深入探讨几种常见的获取Spring容器的方法,包括使用`ApplicationContext`、通过`ServletContext`、利用`ApplicationObjectSupport`、`WebApplicationObjectSupport`以及实现`ApplicationContextAware`接口等。...

    Java获取Bean的几种方式.pdf

    Spring提供了`ContextLoader`和`WebApplicationContextUtils`等工具类,可以从当前线程或ServletContext中获取ApplicationContext。 ```java // 在非Web应用中 ApplicationContext ac = ContextLoader....

    线程中获取spring 注解bean

    当需要在线程中获取Spring注解的bean时,有几种常见的方法: 1. **ThreadLocal**:Spring提供了一种名为`ThreadLocalTargetSource`的特殊`TargetSource`实现,可以将bean实例绑定到当前线程。这样,每个线程都有其...

    几种spring获取bean的方法.txt

    根据提供的文件信息,我们可以总结出以下关于Spring框架中获取Bean的几种方法的相关知识点: ### Spring框架简介 Spring框架是一款开源的轻量级Java EE应用程序开发框架,它通过提供一系列强大的功能来简化Java...

    Spring在代码中获取bean的几种方式详解

    "Spring在代码中获取bean的几种方式详解" Spring框架是Java应用程序中最流行的框架之一,它提供了许多功能强大且灵活的功能之一就是Bean管理机制。Bean是Spring框架的核心组件,用于管理应用程序中的业务逻辑。在...

    spring开发包

    3. **Web**:Spring的Web模块提供了用于构建Web应用程序的功能,包括Spring MVC(Model-View-Controller)框架,它是一种轻量级的Web应用框架,可以实现高效且灵活的Web应用开发。 在描述中提到的"aop所需的jar包...

    整合Spring与Struts的几种方法

    整合Spring和Struts是Web开发中常见的需求,这两者都是Java Web开发的重要框架。Spring以其强大的依赖注入(DI)和面向切面编程(AOP)能力,以及对其他框架的良好集成,而Struts则是一个专注于MVC模式的轻量级框架...

    第一章 Spring4 简介及获取Bean

    获取Bean主要有以下几种方式: 1. **通过Bean的ID**:使用`ApplicationContext`的`getBean()`方法,传入Bean的ID来获取实例。 2. **自动装配(Autowired)**:使用`@Autowired`注解,Spring会自动匹配类型匹配的...

    spring源码注释中文

    Spring 框架是 Java 开发中的一个核心组件,它为构建可维护、模块化和松耦合的应用程序提供了一种强大的方式。Spring 源码注释中文版的提供,使得开发者能够更加深入地理解 Spring 的工作原理,无需经过复杂的编译...

    WebService的几种不同实现方式

    CXF的核心是org.apache.cxf.Bus,它类似于Spring框架中的ApplicationContext,提供了灵活的插拔式架构。CXF的Bus默认使用SpringBusFactory类创建,并且有一个默认ID为“cxf”的BUS。Apache CXF的出现使得Java Web...

    spring中文教程(spring开发指南)_Final.doc

    - **几种依赖注入模式的对比总结**:不同的注入方式适用于不同的场景。例如,构造函数注入更适用于强制依赖的情况,而setter注入则更适合于可选依赖。 - **Spring Bean封装机制** - **BeanWrapper**:提供了一种...

    xfire+Spring整合

    1. **Spring的Bean管理**:Spring通过XML配置或注解方式管理对象(Bean),可以将Web服务实现类作为Spring Bean,这样就能够在Spring容器中初始化、管理和销毁Web服务,确保了服务的生命周期控制。 2. **Autowiring...

    spring 4.3.29 所有jar包

    切面可以被编织到应用程序的其他对象中,提供了一种解耦的方式。 3. **Spring JDBC和ORM**:Spring提供了JDBC抽象层,简化了数据库访问,减少了代码量,同时支持JPA、Hibernate、MyBatis等ORM框架的集成,使得数据...

    Spring4 HelloWorld

    Spring框架是Java开发中广泛使用的轻量级框架,它以其依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect Oriented Programming,简称AOP)为核心,极大地简化了企业级应用的开发工作。"Spring4 Hello...

    在action以外的地方获取dao

    - 除了上述几种情况外,还可以在其他的非Action类中使用这种方式获取到所需的DAO对象。 #### 注意事项 1. **确保ApplicationContext的存在**: - 在使用`getRequiredWebApplicationContext`方法前,要确保...

    Spring开发指南

    Spring提供了几种不同的Bean封装机制,包括: - **Bean Wrapper**:这是一个包装器类,用于封装一个对象及其属性,提供了一种访问和修改Bean属性的方法。 - **Bean Factory**:这是Spring的最基本容器,负责实例化...

    struts+spring+hibernate三大框架整合

    SSH三大框架,即Struts、Spring和Hibernate,是Java Web开发中的常用技术组合,它们各自负责不同的职责:Struts作为MVC模式中的Controller层,处理用户请求并转发到相应的业务逻辑;Spring则作为核心容器,负责依赖...

Global site tag (gtag.js) - Google Analytics