spring的IOC非常的強大。。特別是管理Web項目中的自動加載。
但是實際應用中,可能會碰到這樣兩類的問題:
1.寫UnitTest的時候,需要脫離容器,手動讀取xml文件加載bean。
2.在一個Web容器中,可能某個脫離了spring管理(也就是一個非bean)的類,需要感知并讀取某個spring容易的bean。
下面轉了2篇文章,分別是對應上面2個問題的解決方案
http://hi.baidu.com/%C9%CF%B5%DB%D2%B2%B7%B8%C0%A7/blog/item/f934474a104c3e2008f7ef66.html
Spring中讀取bean配置文件的幾種方式
BeanFactory允許InputStream作為構造函數的參數,也可以org.springframework.core.io.Resource接口。下面這個例子是用ClassPathResource作為參數:
Resource resource = new ClassPathResource("bean.xml");
BeanFactory factory = new XmlBeanFactory(resource);
ActionBean action = (ActionBean) factory.getBean("actionBean");
如果同一個Bean在配置文件有多個bean的定義,則用下面的方法取得所有的對象:
Resource resource = new ClassPathResource("bean.xml");
ListableBeanFactory factory = new XmlBeanFactory(resource);
Map helloBeans = factory.getBeansOfType(ActionBean.class, false, false);
一個應用程序中往往有很多的Bean要放在配置文件,如果所有的Bean都放在一個文件中,維護起來就相當的麻煩,這時我們可以按照模塊把每個模塊用到Bean放到不同的配置文件,Spring提供了相應的方法:
BeanDefinitionRegistry reg = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(reg);
// 載入bean定義檔
reader.loadBeanDefinitions(new ClassPathResource("bean1.xml"));
reader.loadBeanDefinitions(new ClassPathResource("bean2.xml"));
....
// 取得Bean
BeanFactory bf = (BeanFactory) reg;
Object o = bf.getBean("actionBean");
===================================================================
讀取配置文件的幾種方法
在讀spring in aciton 時,他用的BeanFactory factory = new XmlBeanFactory(new FileInputStream("hello.xml"));
可是現在的用的1.2.6版本的構造器(XmlBeanFactory)只能接收Resource接口了,所以調不出來是正常的事情,假設現在有一個文件hello.xml
讀取方法
1:ApplicationContext cx=new FileSystemXmlApplicationContext("hello.xml");//指定的路徑去找文件
2:ApplicationContext factory = new ClassPathXmlApplicationContext("hello.xml");//還會在classpath去找
3:Resource fa = new FileSystemResource("hello.xml");
BeanFactory factory=new XmlBeanFactory(fa);
4:這個要設制classpath了,麻煩
Resource res = new ClassPathResource("com/springinaction/chapter01/hello/hello.xml");
BeanFactory factory=new XmlBeanFactory(res);
好了,用了上面那種方法都可以調用getBean("your bean name")了,
eg: BeanFactory factory=new XmlBeanFactory(fa);
hello he=(hello)factory.getBean("hello");
he.getHello();
================================================================================
貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳貳
http://babycountry.spaces.live.com/blog/cns!18767b1e2eb6d0e1!236.entry
spring 讀取注冊bean的一些方法(轉)
我現在在做的東西,主要用到了框架是struts2+hibernate+spring開發一個上傳,下載,播放視頻,聽歌的東西,在做到獲得到注冊bean的時候,我想通過在web.xml配置context-param中獲得,但老也不成功,后來在網站上看到別人寫的,共同分享:
通過幾個項目的實踐總結一下幾種獲得spring里注冊Bean的方法:
一:方法一(多在struts框架中)繼承BaseDispatchAction
1234567891011121314151617181920212223242526272829303132333435363738394041 package com.mas.wawacommunity.wap.web.action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.actions.DispatchAction;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
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");
}
}
action調用:
123456789101112131415161718192021222324252627282930313233343536373839 package com.mas.wawacommunity.wap.web.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionServlet;
import com.mas.wawacommunity.wap.model.News;
import com.mas.wawacommunity.wap.service.NewsManager;
public class NewsAction extends BaseDispatchAction {
NewsManager newsManager;
public void setServlet(ActionServlet servlet) {
super.setServlet(servlet);
newsManager = (NewsManager) this.getBean("newsManager");
}
/**
* 得到新聞列表
* @param mapping
* @param form
* @param request
* @param resp
* @return
*/
public ActionForward getNewsList(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse resp) {
int category = Text.parseInt(request, "category", 0);
int pageNo = Text.parseInt(request, "pageNo", 1);
int pageSize = Text.parseInt(request, "pageSize", 9);
PageRoll pageRoll = newsManager.getAllNews(category, pageNo, pageSize);
request.setAttribute("pageRoll", pageRoll);
return mapping.findForward("news.list");
}
}
二:方法二實現BeanFactoryAware
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 package com.anymusic.oa.commons.service;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
/**
* Created by IntelliJ IDEA.
* User: Weany
* Date: 2006-4-2
* Time: 2:46:51
* To change this template use File | Settings | File Templates.
*/
public class ServiceLocator implements BeanFactoryAware {
private static BeanFactory beanFactory = null;
private static ServiceLocator servlocator = null;
public void setBeanFactory(BeanFactory factory) throws BeansException {
this.beanFactory = factory;
}
public BeanFactory getBeanFactory() {
return beanFactory;
}
/**
* 創建讀取Bean服務類實例(從spring.xml中加載)
* <bean id="serviceLocator" class="com.am.oa.commons.service.ServiceLocator" singleton="true" />
*/
public static ServiceLocator getInstance() {
if (servlocator == null)
servlocator = (ServiceLocator) beanFactory.getBean("serviceLocator");
return servlocator;
}
/**
* 根據提供的bean名稱得到相應的服務類
* @param servName bean名稱
*/
public static Object getService(String servName) {
return beanFactory.getBean(servName);
}
/**
* 根據提供的bean名稱得到對應于指定類型的服務類
* @param servName bean名稱
* @param clazz 返回的bean類型,若類型不匹配,將拋出異常
*/
public static Object getService(String servName, Class clazz) {
return beanFactory.getBean(servName, clazz);
}
}
action調用:
1234567891011121314151617181920212223242526272829303132333435363738 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();
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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 package com.easou.framework.common.util;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
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調用:
1234567891011121314151617181920212223242526272829303132333435363738 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();
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;
}
}
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/d8111/archive/2008/08/31/2856601.aspx