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,并且得到的是春天语境的子类。
目前来看,第一种方式,比第二更灵活,但风险更大。