`

对于最近一篇帖子"解释一下,为什么需要接口而不直接实现类"的讨论引申出对spring的思考

阅读更多
本人以前对spring用的甚少,基本都是搞EJB或者Seam.用spring只是在一个C/S程序中来配置一些简单类(确实比我手工创建爽多了),一直不明白spring提倡的IOC或者说DI究竟有什么好处,通过上篇帖子的辩论,重新思考了这个问题,同时感谢
深秋小雨童鞋提供的帖子http://www.iteye.com/topic/3067。配合http://www.zhuoda.org/xiaoming/66303.html可能会更清晰的了解这个概念。
大致上我算是了解了spring的优势。废话不说上代码:
假设我最上层的方法(假设就是一个桌面应用的Panel.OnButton_click(Object sender,Event evt)事件触发的方法)需要调用一个Service,现在先不管到底该不该有接口,我假设都是用接口,毕竟这是四巨头说的,这里有一个接口IService.
public interface IService{
    public void doSomething();
}

现在是IService具体的实现类,他需要依赖两个接口:InterfaceA   InterfaceB
public class ConcreteService implements IService{
    private InterfaceA ia;
    private InterfaceB ib;

    public void setA(InterfaceA a){...}
    public InterfaceA getA(){...}
    public void setB(InterfaceB b){...}
    public InterfaceB getB(){...}
}

然后是具体的类ConcreteA implements IInterfaceA,ConcreteB implements IInterfaceB
配置一下Spring让它自动注入我直接可以在Panel.OnButton_click()方法中写调用beanFactory.getBean("ServiceA"),这样我就得到了ConcreteService类,不用写任何工厂。

到这里,似乎spring更本没有带来什么好处,毕竟,我直接写一个工厂。ServiceFactory,FactoryA,FactoryB,再在ServiceFactory的工厂方法里面调用FactoryA,FactoryB创建ConcreteA和ConcreteB对象。似乎也不用费什么力气。
如果不用spring,已经产生了3个工厂类了。

接下来,把应用复杂一点:ConcreteA依赖于另外两个接口InterfaceC   InterfaceD
public class ConcreteA{
    private InterfaceC  ic;
    private InterfaceD  id;
    
    public void setC(InterfaceC c){...}
    public InterfaceC getC(){...}
    public void setD(InterfaceD d){...}
    public InterfaceD getD(){...}

}

同样,我只需要在spring中配置一下属性就可以得到IService的具体实现,并且让ConcreteService依赖InterfaceA,同时使ConcreteA依赖于InterfaceC和InterfaceD。

现在,假设我不使用spring,ConcreteA怎么设置依赖关系?我可能必然再写两个工厂:FactoryC和FactoryD
同时在FactoryA的工厂方法里调用FactoryC和FactoryD创建对象再将它注入到ConcreteA实例中。
现在工厂又多了两个,想像一下,如果依赖关系很多的话,将会创建多少个工厂,然后某个工厂的方法又调用另外的工厂的方法,到处依赖,难以管理。
就我这个破例子已经有5个工厂类了,很难想象大型的程序有多少个工厂类,这么多工厂类如何管理?

如果使用spring,则完全消除了工厂类,我不需要写任何一个工厂类。代码干干净净,我的业务逻辑可以轻松的放到任何一个其他的应用中,只需要合适的配置就行了,不依赖于任何一个工厂
似乎这就是spring的好处。
(注意:以上讨论都是建立在对接口编程的基础上)
在"为什么需要接口而不是实现类中",robin说我对spring的使用连门都没有入,现在请问大家这个理解算不算入门了?
分享到:
评论
6 楼 xly_971223 2008-10-09  
这个问题嘛 实际上Rod Johnson开发spring时候主要是解决事务等AOP问题,要实现AOP就要用容器来托管bean,就引出了spring beanFactory,而要实现beanFactory中类之间的依赖就引出了ioc
我个人是这么判断的
5 楼 young.qiao 2008-10-07  
静待旁观!!
4 楼 terranhao 2008-10-07  
robbin 写道
可怜的人哪......,你连Seam都没入门,你难道不知道Seam也是IoC容器吗?就拿你用的Seam来说IoC吧。


看看这几行代码:
@In        
private User user;
@PersistenceContext 
private EntityManager em;
@Logger    
private Log log;


通过声明,你要求Seam容器给你注入一个user对象,一个em对象,和一个log对象,于是Seam容器乖乖给你注入了。如果不用IoC,那么你给我写写看,请你使用你的工厂,又或者某人青睐的静态方法在RegisterAction里面创建user对象和em对象一下吧。


Seam我是用得多了,你所说的这几个注入也是天天再搞
我的问题不是说我不会用,是说我不知道IOC的好处是什么。
比如以上你说的,以前我用JSF不用SEAM的时候,我直接用JPA的EntityManagerFactory.createEntityManager(unitName)来创建em.但用seam我就直接注入了,好处是这个注入的em可以使用容器托管的事务,我不用再用em来创建Transaction了。实际上,如果我愿意,我也可以在seam里使用EntityManagerFactory.createEntityManager()来创建em.

其实我就是想问,我的帖子里对spring的阐述是不是就是你说的spring的优势,我把FactoryA,FactoryB,FactoryC....等等都通过spring省略了。是不是?
3 楼 robbin 2008-10-07  
可怜的人哪......,你连Seam都没入门,你难道不知道Seam也是IoC容器吗?就拿你用的Seam来说IoC吧。

话说Seam官方文档Chapter 1 Seam入门的例子:

Example 1.2.

@Stateless        
@Name("register")
public class RegisterAction implements Register
{
   @In                                                                                   (2)
   private User user;

   @PersistenceContext                                                                   (3)
   private EntityManager em;

   @Logger                                                                               (4)
   private Log log;

   public String register()                                                              (5)
   {
      List existing = em.createQuery(
         "select username from User where username=#{user.username}")                    (6)
         .getResultList();

      if (existing.size()==0)
      {
         em.persist(user);
         log.info("Registered new user #{user.username}");                               (7)
         return "/registered.jsp";                                                       (8)
      }
      else
      {
         FacesMessages.instance().add("User #{user.username} already exists");           (9)
         return null;
      }
   }

}


看看这几行代码:
@In        
private User user;
@PersistenceContext 
private EntityManager em;
@Logger    
private Log log;


通过声明,你要求Seam容器给你注入一个user对象,一个em对象,和一个log对象,于是Seam容器乖乖给你注入了。如果不用IoC,那么你给我写写看,请你使用你的工厂,又或者某人青睐的静态方法在RegisterAction里面创建user对象和em对象一下吧。
2 楼 terranhao 2008-10-07  
我倒不是在意别人说的
我是很在意别人都说某个东西好,我却不是很清楚它究竟好在哪里。
1 楼 axeon 2008-10-07  
在意别人说法没错,太在意别人说法了,就只能跟着别人屁股后面转了

相关推荐

    c语言数据类型引申和思考

    在“数据类型引申和思考”这一主题中,我们还会讨论枚举类型(enum),这是一种用户自定义的整型别名,常用于定义一组具有特定含义的整数常量。此外,无符号类型(如unsigned int)也是一个值得探讨的话题,它用于...

    布林带引申出的指标.rar

    Bolling b% 可能就是对这一现象的量化表示,通过计算布林带宽度相对于某一时间周期内的平均宽度的比例,来评估当前市场的波动状态。 "Standard Deviation指标(即布林带宽)" 是布林带计算的重要组成部分。标准差...

    建造者模式【Builder Pattern】(三)问题引申

    4. 导演(Director):使用Builder接口来构建产品,但不直接与产品类交互。导演类负责控制构建过程的顺序,使得构建过程可变,同时隔离了客户端代码与产品构建的细节。 二、建造者模式的应用场景 1. 当创建的对象...

    古汉语词义引申的方式.doc

    以“信”为例,它本义为“诚也”,引申为“言语真实”、“诚信”、“相信”、“的确”以及“信物”,这些引申义是通过对“真实”这一核心概念的不同角度的理解和扩展产生的。 词义引申在古汉语中起着至关重要的作用...

    关于思考的写作素材[整理].pdf

    - 孟子的话“观水有术,必观其澜”可以引申为在思考时要观察和分析事物的本质和变化,这样的观察力是深化思考的重要方法。 6. 思考与创新的关系 - 思考是创新的前提,没有深入的思考就没有创新的可能。通过对问题...

    基于jmeter+Java+HttpclientUtil实现的接口测试工具

    基于jmeter+Java+HttpclientUtil实现的接口测试工具,通过Excel表格进行维护接口相关参数信息,借助Jmeter工具通过java请求设计接口测试自动化测试用例。代码重写了JavaSampleClient类,在使用过程中取出了冗余的...

    基于Spring、SpringMVC、Mybatis的SSM复习项目 .zip

    该项目旨在系统复习Spring、SpringMVC和Mybatis的核心知识点,通过一系列的实验(lab)来加深对这些框架的理解和应用。项目涵盖了从基础的IOC容器、依赖注入、AOP思想到Mybatis的数据库操作、事务管理等多个方面。 ...

    在钟表面前的思考(一)作文.doc

    标题中的“在钟表面前的思考(一)”暗示了本文是关于对时间的沉思,作者通过观察钟表的秒针运动,引发了对时间价值的深入探讨。描述中的“范文”标签表明这篇文章可能被用作写作教学的示例,教导学生如何表达个人...

    初中语文文学讨论美文荐读安静

    【描述】:这篇文学讨论的主题围绕着“安静”,通过两位画家的不同创作,展现了安静的多样性和内涵,进而引申出安静对于个人内心世界的重要性。 【标签】:“资料”表明这是作为教学或学习资料,旨在深化学生对...

    新华字典数据接口文件

    《新华字典》是中国最为权威、广泛使用的汉语字典之一,它包含了丰富的汉字信息,包括拼音、部首、笔画数、五笔编码、释义、例句等。本压缩包文件“chinese-xinhua-master”提供的数据接口,允许开发者和研究人员...

    初中语文文学讨论美文荐读花树

    这篇名为“初中语文文学讨论美文荐读花树”的文章,实际上讲述的并不仅仅是花树,而是通过花树的形象,引申出对生活中那些默默付出、不求回报的人们的赞美。文章通过描述作者偶然发现楼前花树盛开的场景,表达了对被...

    单片机原理及其接口技术(第3版,胡汉才).pdf

    此外,本书还配有与教材内容相对应的教学光盘(CAI光盘),内容包括10章和一个附录,提供了“习题与思考题”的参考答案,并且光盘中增加了填充题和选择题,使得自学和教学更加便利。光盘中的动画演示和程序执行功能...

    从各个数学思想中,引申出对于产品思想的方法论.docx

    产品设计是一个涵盖广泛领域,融合了用户需求理解、市场分析、技术创新等多方面能力的综合性工作。数学,作为逻辑和理性的象征,为产品经理提供了强大的思维方式和工具。数学思想不仅在科学研究中起着基础作用,同样...

    初中语文文学讨论美文荐读雨季心思

    这篇名为“初中语文文学讨论美文荐读雨季心思”的文章虽然没有明确的IT标签,但它探讨的主题——雨季的思绪,实际上可以引申出一些关于生活与情感体验的深层次思考,这在文学创作和阅读理解中是非常重要的。...

    MyBatis培训课件

    4. **Mapper 接口与映射文件**:Mapper 接口是定义了 SQL 操作的接口,而这些 SQL 操作的具体实现则写在对应的 XML 映射文件中。这种方式使得接口定义与 SQL 实现分离,增强了代码的可读性和可维护性。 #### 二、...

    司法考试真题试卷三.doc

    虽然这些题目能够引申出一系列的法律知识点,但根据您的要求,我需要生成一篇1000字以上的详细IT知识文章。由于这些题目并不直接关联IT行业,无法直接生成符合要求的文章。如果这些题目是用于一个IT相关的法律案例...

    关于平安夜的作文(15篇).docx

    【标题】和【描述】提及的是一个文档集合,包含了十五篇关于平安夜的作文,而【标签】"技术"可能是指这些作文中涉及到的技术性写作技巧或者与技术教育相关的情景。然而,从【部分内容】来看,实际内容是关于个人经历...

    计算机行业科创板系列研究之信息技术篇:自DCF引申TMT估值全览-0314-申万宏源-43页.pdf

    计算机行业科创板系列研究之信息技术篇:自DCF引申TMT估值全览 本报告对计算机行业科创板系列研究之信息技术篇进行了深入分析,提供了自DCF引申TMT估值全览的研究报告。报告涵盖了TMT行业的估值方法、产业阶段、...

    《大象 Thinking In UML》pdf版(带书签)卷3/3

    在这一部分中,作者将从面向对象的困难和需要入手,讲述面向对象分析的一些基本概念,由此提出为什么需要UML这一话题。另一方面,也讲述了接下来学习建模需要了解的一些基本知识。 第二部分为基础篇,在学习中思考...

Global site tag (gtag.js) - Google Analytics