普通Java类获取Spring的bean traceofsun的专栏 博客频道 CSDN.NET

摘要:
普通Java类获取Spring的bean traceofsun列-博客频道-CSDN NET普通Java类获得Spring bean分类:Extjs开发2010-08-1309:47451人阅读评论,在SSH集成的前提下收集报告。在某些情况下,我们需要在Action之外的类中获取Spring管理的Service对象。业务系统使用的架构基于spring、struts+ibatis+xfire--------------------------------------------------------------------------------------packagecom.dvs.test;导入.springframework.beans。BeansException;importor.springframework.context。应用上下文;importor.springframework.context。应用上下文感知;publicclassSetSpringContextimplementsApplicationContextAware{privatestaticApplicationContextctx;publicvoidsetApplicationContextthrowsBeansException{this.ctx=applicationContext;}publicstaticApplicationContextgetCtx(){returnctx;}publicstaticvoidsetCtx{SetSprContext.ctx=ctx;}}风险:1)因为春天的单身与戈夫描述的不同。2) 因为整个spring全局实例暴露于外部世界,所以它被赋予其他系统来修改spring容器全局变量的函数,这很容易受到恶意篡改或安全漏洞的攻击。

普通Java类获取Spring的bean - traceofsun的专栏 - 博客频道 - CSDN.NET


分类:
Extjs开发

2010-08-13 09:47
451人阅读
评论(0)
收藏
举报

在SSH集成的前提下。某些情况我们需要在Action以外的类中来获得Spring所管理的Service对象。

之前我在网上找了好几好久都没有找到合适的方法。例如:

ApplicationContext context = new ClassPathXmlApplicationContext();

当时我觉得没有这个必要,浪费内存。后来我终于想出了一个解决方法。在此拿来给大家参考下,希望对大家有帮助。

1.创建一个类并让其实现org.springframework.context.ApplicationContextAware接口来让Spring在启动的时候为我们注入ApplicationContext对象.

示例代码:

view plaincopy to clipboardprint?

import org.springframework.beans.BeansException;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ApplicationContextAware;

public class MyApplicationContextUtil implements ApplicationContextAware {

private static ApplicationContext context;//声明一个静态变量保存

@Override

public void setApplicationContext(ApplicationContext contex)

throws BeansException {

this.context=contex;

}

public static ApplicationContext getContext(){

return context;

}

2.在applicationContext.xml文件中配置此bean,以便让Spring启动时自动为我们注入ApplicationContext对象.

例:

<!-- 这个bean主要是为了得到ApplicationContext 所以它不需要其它属*-->

<bean class="org.ing.springutil.MyApplicationContextUtil"></bean>

3.有了这个ApplicationContext之后我们就可以调用其getBean("beanName")方法来得到由Spring 管理所有对象.

1. 通过ApplicationContextAware
2. 通过WebApplicationContext
外部系统 访问已初始化的spring实例, 目前找到两种方法
1. 通过ApplicationContextAware
2. 通过WebApplicationContext
先介绍一点需求。 业务系统要和gis系统进行集成,本来是分来的两个war包通过Web Service调用, 现在要合到一个war中,一起部署。业务系统使用的架构是以spring基础,struts+ibatis+xfire。 GIS的架构,主要是jsf, arc-gis (对这部分不太了解)。 现在GIS系统需要调用业务系统的数据,既然两个系统现在准备合成一个系统,Web Service的方式肯定是一种不太可取的方法,本地调用才有保证效率。
但是,问题出在了GIS系统,不是按照spring架构的IOC方式注入的。现在需要开一个口,给GIS系统spring的全局Context,可以让 GIS不通过IOC也可以得到beans。昨天试了一下,Spring支持这种外来的功能,目前发现了两种办法。不过这两种办法,都存在着风险,后面会说到。
1. 通过ApplicationContextAware。写一个子类,实现ApplicationContextAware的方法,然后把这个类配置到Spring容器中。启动的时候,容器会自动调用setApplicationContext的方法, 把容器全局的context给传进来, 赋值给静态变量ctx。然后,非spring模块,想调用spring容器实例的时候,可以直接通过SetSpringContext .getCtx(); 获得这个context。 因此,方法不依赖于servlet。
--------------------------------------------------------------------------------------------------------
package com.dvs.test;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class SetSpringContext implements ApplicationContextAware{
private static ApplicationContext ctx;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.ctx = applicationContext;
}
public static ApplicationContext getCtx() {
return ctx;
}
public static void setCtx(ApplicationContext ctx) {
SetSprContext.ctx = ctx;
}
}

险:
1) 由于spring中的单例和Gof所描述的单例不一样。因此,其实applicationContext是代码级非单例的,把非静态的对象给一个静态对象,这是不安全的。
2) 由于把整个的spring全局实例,对外暴露,因此给了其他系统,可以修改spring容器全局变量的功能,容易受到恶意篡改,或者安全的漏洞。
2. 通过WebApplicationContext。这种方法的出发点,是两个工程在一个war包里面,因此ServletContext是全局共享的。调用 WebApplicationContextUtils.getWebApplicationContext(getServletContext()); 传一个ServletContext, 然后获得WebApplcationContext的全局实例, 再把这个实例子,传给一个静态变量,给Servlet调用。
--------------------------------------------------------
package com.dvs.test;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
public class GetSpringContext extends HttpServlet {
/**
* <servlet>
* <servlet-name>GetSpringContext</servlet-name>
* <servlet-class>com.dvs.test.GetSpringContext</servlet-class>
* <load-on-startup>1</load-on-startup>
* </servlet>
* 容器起动的时候,加载这个servlet。
*/
public void init(){
WebApplicationContext wac =WebApplicationContextUtils.getWebApplicationContext(getServletContext());
SpringDTO.setCtx(wac);
}
public void doGet(HttpServletRequest request, HttpServletResponse response) {
// wac =WebApplicationContextUtils.getWebApplicationContext(getServletContext());
}
}
中间的类:
package com.dvs.test;
import org.springframework.web.context.WebApplicationContext;
/**
* @author Conan
*
*/
public class GetSpringContextFactory<E> {
public E getBean(String name) {
WebApplicationContext wac = SpringDTO.getCtx();
return (E) wac.getBean(name);
}
}

中间的类:
package com.dvs.test;
import org.springframework.web.context.WebApplicationContext;
public class SpringDTO {
private static WebApplicationContext ctx;
public static WebApplicationContext getCtx() {
return ctx;
}
public static void setCtx(WebApplicationContext ctx) {
SprFactory.ctx = ctx;
}
}
调用的类:
package com.dvs.test;
import java.util.List;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.dvs.sec.model.usergroup.UserGroupDTO;
import com.dvs.sec.service.usergroup.UserGroupService;
public class TestSpring extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response) {
test();
}
public void test(){
GetSpringContextFactory ctx = new GetSpringContextFactory();
UserGroupService ug = (UserGroupService) ctx.getBean("userGroupService");
try {
List<UserGroupDTO> list= ug.getUserGroupList();
for(UserGroupDTO dto:list){
System.out.println(dto.getPk());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
----------------------------------------------------------
风险:
1. 与第一种方法一样,都是给外部一个static变量,把全局的spring实例给外部用。
2. 这种方式,外部调用的时候必需依赖与Servlet,并且得到的是Spring Context的子类。
目前来看,第一种方式,比第二更灵活,但风险更大。

免责声明:文章转载自《普通Java类获取Spring的bean traceofsun的专栏 博客频道 CSDN.NET》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇整理了几种字符串截取方法数据词典与ABAP类型映射下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Quartz在Spring中动态设置cronExpression (spring设置动态定时任务)

什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定)。 这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户修改配置文件,但总需要重新启动web服务啊,研究了下Quartz在Spring中的动态定时,发现<bean > <property name="job...

servlet过滤器1 解决字符集乱码 filter

package com.tarena.web.filter;    import java.io.IOException;    import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servl...

Spring batch学习 详细配置解读(3)

     第一篇讲到普通job 配置 那么spring  batch 给我们提供了丰富的配置,包括定时任务,校验,复合监听器,父类,重启机制等。              下面看一个动态设置读取文件的配置                 1.动态文件读取            <?xml version="1.0" encoding="UTF-8"?...

Android广播机制的基本使用

一提到广播我们第一感觉就会联想到小时候村里面的广播,安卓的广播机制也是类似于大喇叭。有发送广播的地方,也有接收广播的地方。但是具体怎么操作呢,我们来一步一步的看下去~ 安卓的广播种类 系统发送的广播:具体有哪些可以看下这篇Bloghttp://blog.sina.com.cn/s/blog_7dbac1250101mt5h.html app发送的广播...

信息摘要算法之五:HMAC算法分析与实现

MAC(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥。因此MAC算法也经常被称作HMAC算法。 1、HMAC概述 HMAC算法首先它是基于信息摘要算法的。目前主要集合了MD和SHA两大系列消息摘要算法。其中MD系列的算法有HmacMD2、HmacMD4、...

ASP.NET Core:使用EntityFrameworkCore操作MySql来丰富仓储模块

概述 上一篇简单介绍了Dapper的基本用法,数据的存储为SqlServer。那么这一篇就记录一下使用EFCore来操作MySql的一些方式,这种模式比较适合那种一个项目中需要操作多种数据库的模式。不过因为微软官方并没有提供其驱动,所以我们需要借助MySql官方提供的驱动进行基本的增删改查操作。这样一来我们也可以将数据库迁移到Linux服务器上了,是不是很...