论坛首页 Java企业应用论坛

spring 依赖注入到直接new 对象

浏览 13317 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-10-27  

      当为遗留系统加入spring时,经典问题就是遗留系统需要引用spring管理的bean。幸好spring有机制可以处理这些。

建一个类实现ApplicationContextAware接口,有一个引用ApplicationContext的静态成员,然后,遗留系统需要引用spring管理的bean的地方,使用这个类。

1.比如:我这里建一个SpringContext类

package net.blogjava.chenlb;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**
 * 此类可以取得Spring的上下文.
 * Spring 使new方法创建的对象可以引用spring管理的bean.
 * 2007-10-18 上午11:12:33
 * 
@author chenlb
 
*/
public class SpringContext implements ApplicationContextAware {

    
protected static ApplicationContext context;
    
    
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        context 
= applicationContext;
    }

    
public static ApplicationContext getContext() {
        
return context;
    }

}


2.然后在spring配置文件里加

<bean id="springContext" class="net.blogjava.chenlb.SpringContext"></bean>


3.其它类中引用

MyBean myBean = (MyBean) SpringContext.getContext().getBean("myBean");


4.如果老是写SpringContext.getContext().getBean("...");麻烦,可以建一个工厂类来返回你要的bean

package net.blogjava.chenlb;



public class MyServerFactory {


    
public static MyBean1 getMyBean1() {
        
return (MyBean1) SpringContext.getContext().getBean("myBean1");
    }
    

}



^_^

流浪汗 2007-10-27 16:31 发表评论
   发表时间:2007-10-29  
为什么不把要用到spring的bean配置到ApplicationContext里面?
0 请登录后投票
   发表时间:2007-11-01  
有遗留系统的类没法配置到spring的bean里.
0 请登录后投票
   发表时间:2007-11-02  
谢谢这个帖子 。。正好我需要加载一个bean,,但没有办法注入近来。。使用一些方法总是有些问题。。这个代码正好完全满足我的要求
0 请登录后投票
   发表时间:2007-11-06  
谢谢,正好可以用上了。
如果楼主能够给多点代码,或者完整一点的就好了。总感觉这样给出草草的。
PS:大侠们,给个入门没话说,投隐藏就真无语了!
0 请登录后投票
   发表时间:2007-11-13  
看来,也有人同我这样应用需要的朋友. 我在两个项目遇到这个问题,而且都这种方式解决,个人觉得还没有发现更好的解决方式. 其中一个项目是重做的,重做的时候不用之前做好的一些东西. 之前的类在构造函数里要初始化一此资源(现在 这此被spring管理了), 所以这此类的构造里要引用spring管理的bean, 解决方法是: SpringContext.getContext()... 第二个项目是,系统要用到一个组件,这个组件是用xml定义生成对象的,所以这些生成的对象不能引用spring管 理的bean, 解决方式是:在这个组件xml定义的类里用工厂方法模式: public static PrintManager getPrintManager() { return (PrintManager) SpringContext.getContext().getBean("printManager"); } 所有用到PrintManager(spring管理的)的类(定义不能放到spring中,而是放到组件xml定义的)都用 ServerFactory.getPrintManager()得到spring管理的PrintManager 有时间整理一下,我在项目的用过的这种模式,与大家一起讨论. javaeye编辑帖子,很不爽,不会分段. :o
0 请登录后投票
   发表时间:2007-11-13  
引用
看来,也有人同我这样应用需要的朋友. 我在两个项目遇到这个问题,而且都这种方式解决,个人觉得还没有发现更好的解决方式. 其中一个项目是重做的,重做的时候不用之前做好的一些东西. 之前的类在构造函数里要初始化一此资源(现在 这此被spring管理了), 所以这此类的构造里要引用spring管理的bean, 解决方法是: SpringContext.getContext()... 第二个项目是,系统要用到一个组件,这个组件是用xml定义生成对象的,所以这些生成的对象不能引用spring管 理的bean, 解决方式是:
在这个组件xml定义的类里用工厂方法模式:
public static PrintManager getPrintManager() { 
return (PrintManager) SpringContext.getContext().getBean("printManager"); 
}

所有用到PrintManager(spring管理的)的类
(定义不能放到spring中,而是放到组件xml定义的)
都用 ServerFactory.getPrintManager()得到spring管理的PrintManager 有时间整理一下,
我在项目的用过的这种模式,与大家一起讨论.

javaeye编辑帖子,很不爽,不会分段.


手动bbcode
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics