一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

普通Java類(lèi)獲取Spring的bean

 yan的圖書(shū)41 2014-06-10
在SSH集成的前提下。某些情況我們需要在Action以外的類(lèi)中來(lái)獲得Spring所管理的Service對(duì)象。

  之前我在網(wǎng)上找了好幾好久都沒(méi)有找到合適的方法。例如:


  ApplicationContext context = new ClassPathXmlApplicationContext();


  當(dāng)時(shí)我覺(jué)得沒(méi)有這個(gè)必要,浪費(fèi)內(nèi)存。后來(lái)我終于想出了一個(gè)解決方法。在此拿來(lái)給大家參考下,希望對(duì)大家有幫助。


  1.創(chuàng)建一個(gè)類(lèi)并讓其實(shí)現(xiàn)org.springframework.context.ApplicationContextAware接口來(lái)讓Spring在啟動(dòng)的時(shí)候?yàn)槲覀冏⑷階pplicationContext對(duì)象.


  示例代碼:


  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;//聲明一個(gè)靜態(tài)變量保存


  @Override


  public void setApplicationContext(ApplicationContext contex)


  throws BeansException {


  this.context=contex;


  }


  public static ApplicationContext getContext(){


  return context;


  }


  2.在applicationContext.xml文件中配置此bean,以便讓Spring啟動(dòng)時(shí)自動(dòng)為我們注入ApplicationContext對(duì)象.


  例:


  <!-- 這個(gè)bean主要是為了得到ApplicationContext 所以它不需要其它屬*-->


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


  3.有了這個(gè)ApplicationContext之后我們就可以調(diào)用其getBean("beanName")方法來(lái)得到由Spring 管理所有對(duì)象.

 

 

1. 通過(guò)ApplicationContextAware
2. 通過(guò)WebApplicationContext
外部系統(tǒng) 訪問(wèn)已初始化的spring實(shí)例, 目前找到兩種方法
1. 通過(guò)ApplicationContextAware
2. 通過(guò)WebApplicationContext

先介紹一點(diǎn)需求。 業(yè)務(wù)系統(tǒng)要和gis系統(tǒng)進(jìn)行集成,本來(lái)是分來(lái)的兩個(gè)war包通過(guò)Web Service調(diào)用, 現(xiàn)在要合到一個(gè)war中,一起部署。業(yè)務(wù)系統(tǒng)使用的架構(gòu)是以spring基礎(chǔ),struts+ibatis+xfire。 GIS的架構(gòu),主要是jsf, arc-gis (對(duì)這部分不太了解)。 現(xiàn)在GIS系統(tǒng)需要調(diào)用業(yè)務(wù)系統(tǒng)的數(shù)據(jù),既然兩個(gè)系統(tǒng)現(xiàn)在準(zhǔn)備合成一個(gè)系統(tǒng),Web Service的方式肯定是一種不太可取的方法,本地調(diào)用才有保證效率。

但是,問(wèn)題出在了GIS系統(tǒng),不是按照spring架構(gòu)的IOC方式注入的?,F(xiàn)在需要開(kāi)一個(gè)口,給GIS系統(tǒng)spring的全局Context,可以讓 GIS不通過(guò)IOC也可以得到beans。昨天試了一下,Spring支持這種外來(lái)的功能,目前發(fā)現(xiàn)了兩種辦法。不過(guò)這兩種辦法,都存在著風(fēng)險(xiǎn),后面會(huì)說(shuō)到。

1. 通過(guò)ApplicationContextAware。寫(xiě)一個(gè)子類(lèi),實(shí)現(xiàn)ApplicationContextAware的方法,然后把這個(gè)類(lèi)配置到Spring容器中。啟動(dòng)的時(shí)候,容器會(huì)自動(dòng)調(diào)用setApplicationContext的方法, 把容器全局的context給傳進(jìn)來(lái), 賦值給靜態(tài)變量ctx。然后,非spring模塊,想調(diào)用spring容器實(shí)例的時(shí)候,可以直接通過(guò)SetSpringContext .getCtx(); 獲得這個(gè)context。 因此,方法不依賴(lài)于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;
}

}

 

險(xiǎn):
1) 由于spring中的單例和Gof所描述的單例不一樣。因此,其實(shí)applicationContext是代碼級(jí)非單例的,把非靜態(tài)的對(duì)象給一個(gè)靜態(tài)對(duì)象,這是不安全的。
2) 由于把整個(gè)的spring全局實(shí)例,對(duì)外暴露,因此給了其他系統(tǒng),可以修改spring容器全局變量的功能,容易受到惡意篡改,或者安全的漏洞。

2. 通過(guò)WebApplicationContext。這種方法的出發(fā)點(diǎn),是兩個(gè)工程在一個(gè)war包里面,因此ServletContext是全局共享的。調(diào)用 WebApplicationContextUtils.getWebApplicationContext(getServletContext()); 傳一個(gè)ServletContext, 然后獲得WebApplcationContext的全局實(shí)例, 再把這個(gè)實(shí)例子,傳給一個(gè)靜態(tài)變量,給Servlet調(diào)用。

--------------------------------------------------------
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>
* 容器起動(dòng)的時(shí)候,加載這個(gè)servlet。
*/
public void init(){
WebApplicationContext wac =WebApplicationContextUtils.getWebApplicationContext(getServletContext());
SpringDTO.setCtx(wac);
}

public void doGet(HttpServletRequest request, HttpServletResponse response) {
// wac =WebApplicationContextUtils.getWebApplicationContext(getServletContext());
}
}

中間的類(lèi):
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);
}

}


中間的類(lèi):
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;
}

}

調(diào)用的類(lèi):
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();
}
}
}

----------------------------------------------------------
風(fēng)險(xiǎn):
1. 與第一種方法一樣,都是給外部一個(gè)static變量,把全局的spring實(shí)例給外部用。
2. 這種方式,外部調(diào)用的時(shí)候必需依賴(lài)與Servlet,并且得到的是Spring Context的子類(lèi)。


目前來(lái)看,第一種方式,比第二更靈活,但風(fēng)險(xiǎn)更大。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多

    国产爆操白丝美女在线观看| 一区二区免费视频中文乱码国产 | 久久热九九这里只有精品| 99久久免费中文字幕| 91蜜臀精品一区二区三区| 老司机精品在线你懂的| 国产黑人一区二区三区| 欧美日韩人妻中文一区二区| 少妇人妻无一区二区三区| 国产又粗又猛又黄又爽视频免费| 老外那个很粗大做起来很爽| 欧美不卡高清一区二区三区| 久草精品视频精品视频精品| 日韩欧美中文字幕av| 国产免费黄片一区二区| 精品人妻一区二区三区四在线| 91欧美亚洲视频在线| 日韩国产精品激情一区| 久久精品伊人一区二区| 亚洲国产天堂av成人在线播放| 少妇肥臀一区二区三区| 亚洲精品熟女国产多毛| 出差被公高潮久久中文字幕| 亚洲综合精品天堂夜夜| 国产亚洲中文日韩欧美综合网| 亚洲精品日韩欧美精品| 一级片二级片欧美日韩| 国产精品成人免费精品自在线观看| 少妇人妻无一区二区三区| 91欧美亚洲精品在线观看| 99福利一区二区视频| 国产免费黄片一区二区| 亚洲丁香婷婷久久一区| 久久久免费精品人妻一区二区三区 | 日韩精品在线观看完整版| 欧美自拍系列精品在线| 国产成人精品视频一区二区三区| 午夜精品福利视频观看| 大尺度剧情国产在线视频| 午夜精品久久久99热连载| 精品人妻精品一区二区三区|