goldrain

金色雨点

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  37 随笔 :: 2 文章 :: 239 评论 :: 0 Trackbacks
Spring依赖其IOC特征,轻松的管理着一堆非常有价值的bean,这些bean在spring容器中的依赖关系都已注入好,所以相互调用非常方便。

但既然是有价值的bean,我们就想在Java代码的各处都能调用,实际中的确有这样的场景,比如:
struts的action要用其中的service;
充血领域模型的hibernate实体会需要dao。

要调用这些bean,现在也确实有很多做法:
以下代码描述的方式,被称为bad smell,是最不自然的方式,不被提倡;

JdbcDao jdbcDao = (JdbcDao)springContext.getBean("jdbcDao");


自然的调用方式是,你调用的bean,也是注入的:
struts2是通过一个spring plugin来做到的;
hibernate就没那么简单了,要用到annotation声明,要什么AspectJ织入,概念复杂,麻烦之极;

我有一个简单的做法,至少对单件的bean很可行(一般我们需要的bean也就是单件的)。思路很简单,依靠spring的注入机制,把容器内的bean注入为静态变量。而静态变量天然就是各处可用的。以下是代码:

Java:
public class JdbcDao {


    
//静态变量
    private static JdbcDao instance;

    
//静态方法,获取单件对象
    public static JdbcDao get(){
        
return instance;
    }

    
//对象方法,注入到静态变量
    public void setInstance(JdbcDao _inst){
      instance 
= _inst;
    }

    public List query(String sql){
       ....
    }



}

spring配置,将自身注入:
    <bean id="jdbcDao" class="net.jacker.dao.JdbcDao">

        
<property name="instance">
            
<ref bean="jdbcDao" />
        
</property>

    
</bean>


这样,只要spring容器启动,构造好bean后,就会自行将其注入到静态变量,然后在各处的调用就很简单了:
    public class UserAction {
       JdbcDao jdbcDao 
= JdbcDao.get();

       
public String execute(){
           jdbcDao.query();
       }

       ...

    }


注:网上有一些思路也是从静态变量入手的,但做法有所不同,有的需要依赖web容器,就不多做介绍了。

最后要说的就是,这也是单件模式的一种实现,使用spring容器配置注入好你的单件对象,并在任何地方使用之。
posted on 2009-04-02 12:04 goldrain 阅读(1574) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: