返回首页
当前位置: 主页 > 开源技术 > Spring >

自然的访问spring容器中的bean

时间:2009-08-19 21:59来源:未知 作者:admin 点击:
Spring依赖其IOC特征,轻松的管理着一堆非常有价值的bean,这些bean在spring容器中的依赖关系都已注入好,所以相互调用非常方便。 但既然是有价值的bean,我们就想在Java代码的各处都能调
  

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容器配置注入好你的单件对象,并在任何地方使用之。

 

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
发布者资料
admin 查看详细资料 发送留言 加为好友 用户等级:高级会员 注册时间:2009-06-09 07:06 最后登录:2009-08-19 21:08
推荐内容