spring调用beanjava,springmvc获取bean

  spring调用beanjava,springmvc获取bean

  普通Java类得到Spring的bean-traceofsun专栏-博客频道-CSDN。网

  普通Java类得到春之豆。

  分类:

  Extjs开发

  2010-08-13 09:47

  41人阅读

  评论(0)

  收集

  前提是报SSH整合。在某些情况下,我们需要将Spring管理的服务对象放在Action以外的类中。

  之前在网上找了很久,也没有找到合适的方法。例如:

  application context context=new classpathmlaplicationcontext();

  当时我觉得没必要浪费内存。我终于想出了一个解决办法。这里供你参考,希望对你有帮助。

  1.创建一个类,让它实现org . Spring framework . context . applicationcontextaware接口,让Spring在启动时为我们注入applicationcontext对象。

  示例代码:

  查看剪贴板打印文本?

  导入org . spring framework . beans . beans exception;

  导入org . spring framework . context . application context;

  import org . spring framework . context . applicationcontextaware;

  公共类MyApplicationContextUtil实现ApplicationContextAware {

  私有静态ApplicationContext上下文;//声明要保存的静态变量

  @覆盖

  公共void setApplicationContext(application context contex)

  扔豆子异常{

  this.context=contex

  }

  公共静态application context get context(){

  返回上下文;

  }

  2.在applicationContext.xml文件中配置这个bean,这样当Spring启动时,它会自动为我们注入applicationContext对象。

  示例:

  !-这个bean主要是获取ApplicationContext,所以不需要其他的属*-

  豆子/豆子

  3.有了这个ApplicationContext,我们可以调用它的getBean(beanName )方法来获取Spring管理的所有对象。

  1.通过ApplicationContextAware

  2.通过WebApplicationContext

  外部系统访问初始化的spring实例。目前找到两种方法。

  1.通过ApplicationContextAware

  2.通过WebApplicationContext

  我先介绍一些要求。业务系统应与gis系统集成。原来是通过Web服务调用两个独立的war包,现在应该合并成一个war一起部署。系统使用的架构是基于spring,struts ibatis xfire。GIS架构,主要是jsf,arc-gis(这部分不太懂)。现在GIS系统需要调用业务系统的数据。既然现在两个系统已经准备集成为一个系统,那么Web Service的方式肯定是不太可取的方法,本地调用可以保证效率。

  但问题出在GIS系统,没有按照spring架构的IOC模式注入。现在需要为GIS系统spring的全局上下文开放一个端口,这样GIS就可以不用IOC就可以获得beans。昨天试了一下,Spring支持这个外来功能。目前已经找到了两种方法。但是两种方法都有风险,后面会讨论。

  1.通过ApplicationContextAware。编写一个子类来实现ApplicationContextAware的方法,然后将这个类配置到Spring容器中。启动时,容器会自动调用setApplicationContext的方法,传入容器的全局上下文,并将其赋给静态变量ctx。然后,当一个非spring模块想要调用spring容器实例时,可以直接通过SetSpringContext。getCtx();了解这一背景。因此,该方法不依赖于servlet。

  -

  包com . DVS . test;

  导入org . spring framework . beans . beans exception;

  导入org . spring framework . context . application context;

  import org . spring framework . context . applicationcontextaware;

  公共类SetSpringContext实现ApplicationContextAware{

  私有静态ApplicationContext ctx

  public void setApplicationContext(application context application context)抛出BeansException {

  this.ctx=应用程序上下文;

  }

  公共静态应用程序上下文getCtx() {

  返回ctx

  }

  公共静态void set CTX(application context CTX){

  SetSprContext.ctx=ctx

  }

  }保险:

  1) 由于春天中的单例和古老的星期五可靠的好友所描述的单例不一样。因此,其实应用程序上下文是代码级非单例的,把非静态的对象给一个静态对象,这是不安全的。

  2) 由于把整个的春天全局实例,对外暴露,因此给了其他系统,可以修改春天容器全局变量的功能,容易受到恶意篡改,或者安全的漏洞。

  2.通过WebApplicationContext。这种方法的出发点,是两个工程在一个战争包里面,因此小型应用程序上下文是全局共享的。调用webapplicationcontextutils。getwebapplicationcontext(getServletContext());传一个ServletContext,然后获得webapplocationcontext的全局实例,再把这个实例子,传给一个静态变量,给小型应用程序调用。

  -

  包com。DVS。测试;

  导入javax。servlet。http。http servlet

  导入javax。servlet。http。http servlet请求;

  导入javax。servlet。http。http servlet响应;

  导入org。spring框架。网络。语境。webapplicationcontext

  导入组织。spring框架。网络。语境。支持。webapplicationcontextutils

  公共类GetSpringContext扩展HttpServlet {

  /**

  * servlet

  * servlet-name getspring context/servlet-name

  * servlet类com。DVS。测试。getspring上下文/servlet-class

  *启动时加载1/启动时加载

  * /servlet

  * 容器起动的时候,加载这个servlet。

  */

  public void init(){

  WebApplicationContext WAC=webapplicationcontextutils。getwebapplicationcontext(getServletContext());

  spring dto。设定CTX(WAC);

  }

  公共void doGet(HttpServletRequest请求,HttpServletResponse响应){

  //WAC=webapplicationcontextutils。getwebapplicationcontext(getServletContext());

  }

  }

  中间的类:

  包com。DVS。测试;

  导入org。spring框架。网络。语境。webapplicationcontext

  /**

  * @作者柯南

  *

  */

  公共类GetSpringContextFactory E {

  公共E getBean(字符串名){

  WebApplicationContext WAC=spring dto。获取CTX();

  返回WAC。获取bean(名称);

  }

  }

  中间的类:

  包com。DVS。测试;

  导入org。spring框架。网络。语境。webapplicationcontext

  公共类SpringDTO {

  私有静态WebApplicationContext ctx

  公共静态WebApplicationContext getCtx() {

  返回中强

  }

  公共静态无效集CTX(CTX WebApplicationContext){

  SprFactory.ctx=ctx

  }

  }

  调用的类:

  包com。DVS。测试;

  导入Java。util。列表;

  导入javax。servlet。http。http servlet

  导入javax。servlet。http。http servlet请求;

  导入javax。servlet。http。http servlet响应;

  导入com。DVS。第二模型。用户群。用户组do;

  导入com。DVS。第二服务。用户群。用户组服务;

  公共类TestSpring扩展HttpServlet{

  公共void doGet(HttpServletRequest请求,HttpServletResponse响应){

  test();

  }

  公共无效测试(){

  GetSpringContextFactory CTX=new GetSpringContextFactory();

  用户组服务ug=(用户组服务)ctx.getBean(用户组服务);

  尝试{

  list UserGroupDTO list=ug。getuser group list();

  for(usergroupdoto dto:list){

  系统。出去。println(dto。getpk());

  }

  } catch(异常e) {

  e。printstacktrace();

  }

  }

  }

  -

  风险:

  1.与第一种方法一样,都是给外部一个静电变量,把全局的春天实例给外部用。

  2.这种方式,外部调用的时候必需依赖与Servlet,并且得到的是春天语境的子类。

  目前来看,第一种方式,比第二更灵活,但风险更大。

spring调用beanjava,springmvc获取bean