zoukankan      html  css  js  c++  java
  • 为Servlet或普通Java程序注入Spring托管的Bean、数据源

    S2SH中都是层层注入,action交给Spring托管。即,往Struts的Action中注入Service,往Service中又注入DAO,这个都是通过配置完成的。

    经过对Spring原理和源码的研究,发现,可以写一个SpringBeanFactory.java,自己实现获取bean实例的功能。下面分两种情况进行说明。

    情况1:在web.xml中已经配置Spring的applicationContext文件

    一般我们是这么配置Spring的:

    	<!-- spring上下文 -->
    	<context-param>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>classpath:/service.xml</param-value>
    	</context-param>
    	<!-- 启动监听 -->
    	<listener>
               <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    	</listener>
    

    此时,可以通过

    org.springframework.web.context.ContextLoaderListener来获取bean。关键代码如下:

    public SpringBeanFactory{
    	private static ApplicationContext ctx;
    	/** 通过ContextLoaderListener取得ctx */
    	public static void initApplicationContext(){
    		ctx=ContextLoaderListener.getCurrentWebApplicationContext();
    	}
    	/** 通过泛型方法取得bean实例 */
    	public static <T> T getBean(String name){
    		if(ctx==null){
    			initApplicationContext();
    		}
    		return (T) ctx.getBean(name);
    	}
    }
    


    这样,无论在Servlet,还是在普通Java类中,都可以调用getBean()方法获取Spring托管的Bean对象了。

    情况2:在web.xml中未配置Spring

          此时,我们可以自己写程序去加载xml文件,生成ctx,关键代码如下:

    public class SpringBeanFactory {
    	private static ApplicationContext ctx = null;	
    	public static void initApplicationContext(){
    		if (ctx == null) {
    			ctx = new ClassPathXmlApplicationContext(
    					new String[] {
    							"classpath:applicationContext-Comm.xml",
    							"classpath:applicationContext-B2BPL.xml"
    							});
    		}
    	}
    }
    


    其本质和第一种情况是一样的,如果自己再建一个StartListener.java,如下:其本质和第一种情况是一样的,如果自己再建一个StartListener.java,如下:

    public class StartListener implements ServletContextListener {
    	@Override
    	public void contextInitialized(ServletContextEvent event) {
    		event.getServletContext().log("Start initing ApplicationContext...");
    		SpringBeanFactory.initApplicationContext();
    	}
    }
    


    并把StartListener.java配置在web.xml中,这样就可以在服务器启动的时候得到ctx了。并把StartListener.java配置在web.xml中,这样就可以在服务器启动的时候得到ctx了。

    • 作者:zollty(接收技术咨询和工作机会)
    • 出处:http://www.cnblogs.com/zollty/
    • 本文版权归作者和博客园共有,欢迎转载,但请在文章页面明显位置给出原文连接,否则视为侵权。
    • 关于博主,85后程序员,擅长复杂分布式系统架构,中间件设计开发,关注效率/性能/稳定性。
    • 对于自己,博文只是总结。在总结的过程发现问题,解决问题。
    • 对于他人,在此过程如果还能附带帮助他人,那就再好不过了。
    • 感谢您的阅读。如果文章对您有用,那么请轻轻点个赞,以资鼓励。
  • 相关阅读:
    【BZOJ4915】简单的数字题(数学)
    【BZOJ2140】稳定婚姻(匈牙利算法板子题)
    【BZOJ2739】最远点(决策单调性)
    【AT3526】[ARC082C] ConvexScore(贡献转化+容斥)
    【CF1264D2】Beautiful Bracket Sequence(组合数学)
    【洛谷2561】[AHOI2002] 黑白瓷砖(Polya定理)
    【洛谷3511】[POI2010] MOS-Bridges(混合图欧拉回路)
    【洛谷4226】避难所(构造)
    【洛谷7453】[THUSCH2017] 大魔法师(线段树+矩乘)
    【洛谷3207】[HNOI2010] 物品调度(置换问题)
  • 原文地址:https://www.cnblogs.com/zollty/p/3029541.html
Copyright © 2011-2022 走看看