应用IoC,代码马上直观多了


IoC在应用开发中是一个非常有力的概念。如Martin Flower所述,IoC的一种表现形式就是依赖性注射。依赖性注射用的是好莱坞原则,"不要找我,我会找你的。"。换句来说,你的类不会去查找或是实例化它们所依赖的类。控制恰好是反过来的,某种容器会设置这种依赖关系。使用IoC常常使代码更加简洁,并且为相互依赖的类提供一种很好的方法。依赖性注射存在三种方式:

a) 基于setter的(setter-based):这些类是特指那些拥有一个无参数的构造器,在绑定依赖关系时提供setter给IoC容器使用的javabean。这是Spring推荐使用的形式。当Spring支持基于构造器的注射时,大量的构造器带的参数就很难管理。

b) 基于构造器的(Constructor-based):这种类拥有带有多个参数的构造器。IoC容器会查找和激活那些基于大量参数和对象类型的构造器。这种方法保证了一个bean不是在一个非法状态下创建的。

c) 基于getter的(Getter-based)或称为方法注射:与基于setter的方式类似,不同的是你为你的添加一个getter方法。当它在内部运行时,IoC容器会重载这个方法,但在测试时你很容易指定你要用的getter方法。这种方法只是在最近被提及到。你可以从TheServerSide.com上找到更多的信息。

下面是一个没有预设IoC一个类的例子。它是一个叫做listUsers的Struts Action,它依赖一个UserDAO类,而这个类需要一个Connection作为构造器的一部分。

 public class ListUsers
     extends Action {
   public ActionForward execute(ActionMapping mapping,
                                ActionForm form,
                                HttpServletRequest request,
                                HttpServletResponse response) throws Exception {
// get a connection from the database
     Connection conn = DatabaseUtils.getConnection();
     UserDAO dao = DAOFactory.createUserDAO("hibernate", conn);
     List users = dao.getUsers();
     DatabaseUtils.closeConnection(conn);
     return mapping.findForward("success");
   }
 }
上面的代码设计比较难看。通过实现一个预设IoC的类把代码清理一下。
 public void deleteMudadmUsers(final MudadmUsers mudadmUsers) {
   getHibernateTemplate().delete(mudadmUsers);
 }

 public class ListUsers
     extends Action {
   private UserDAO dao;
   public void setUserDAO(UserDAO userDAO) {
     this.dao = userDAO;
   }

   public ActionForward execute(ActionMapping mapping,
                                ActionForm form,
                                HttpServletRequest request,
                                HttpServletResponse response) throws Exception {
     List users = dao.getUsers();
     return mapping.findForward("success");
   }
 }
上面的类没有包含任何查找(lookup)的代码。这样代码看起来更加清晰,并有利于测试。例如,在你的测试中,你可以使用针对DAO使用一个Mock Object来消除数据层的各依赖关系。一个好的IoC容器应该允许开发人员为UserDAO绑定一个连接(connection)(或是DataSource)。使用Spring你可以选择,把连接绑定到数据层,还是使用一个过滤器为每个请求打开一个新的连接。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值