3

我想了解春天。我已经读过它并做了一些教程。我得到了IoC范例,以及DI在Spring中实现它的事实。什么是不使用春天的问题

我的问题是这样的:你没有使用Spring会失去什么?我明白这是一个很大的问题,有些主观。但是如果你可以写出几个点或者给出一个如果Spring未被使用可能发生的问题的例子,我认为这会对我和其他许多人有所帮助。

回答

2

实际上没有问题。但是如果你开始编写你的代码,你将最终得到一个像Spring一样的本地化框架。使用Spring获得的东西是该框架已经比通用框架更通用了,您可以在很多不同的项目中使用它。最重要的(也许)是Spring已经被很多使用它的用户测试过了。

当然,你也可以尝试另一个框架,不只是春天。这里有很多有...

1

伶牙俐齿的回答是,你必须给它的所有自行编码。我不知道很多关于Spring(还),但即便而使用Spring,你需要两个编辑点构造器注入的基本行为将需要大量的代码:

在配置:

<sectionGroup name="spring"> 
    <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/> 
    <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" /> 
    </sectionGroup> 

    <spring> 
    <context> 
     <resource uri="config://spring/objects"/> 
    </context> 
    <objects xmlns="http://www.springframework.net"> 
     <object name="mediaLibrary" type="AlbumLibraryWPF.AlbumLibrary, AlbumLibrary"/> 
    </objects> 
    </spring> 

在代码:

IApplicationContext ctx = ContextRegistry.GetContext(); 
    library = (Library)ctx.GetObject("mediaLibrary"); 

你应该怎么做:你自己写一个DI框架还是专注于构建你的解决方案?

3

春天是远远超过只是一个工具的IoC(DAO认为相关的东西,方便MVC支持,测试工具,...)。在我看来,它逐渐成长为一种Java的“味道”。但这不是重点:) 说到IoC/DI,你松了什么不使用它是在应用程序中获得松散耦合的最简单方法,这与可重用性有关。很显然,大多数人倾向于考虑另一个项目中组件的可重用性,这在我的经验中并不常见。当你必须对你的代码进行单元测试时,会出现重用性最大的好处。 编程通过使用DI接口 /国际奥委会做出单元测试那么容易,即使是那些谁也不愿意单元测试将开始爱它。在UT的事

松耦合和收益是一件事,你将失去。

0

的IoC主要是Java语言,因为当大多数应用程序开始生长,你不设计一个模块化/松耦合,你最终互联类的一大堆没有没有合理的范围内是一件好事。

对于初学者来说,春节和其他的IoC/DI框架,让你觉得从一开始模块化权利。这很重要,因为如果你的代码很好地模块化/松散耦合,那么你最终会进行组件化和重用,从而导致更好的单元测试(无论如何你都要进行单元测试)。

如果我想编写一个DAO,我可以定义它的接口前面:

interface IPersonDao { 
    List<Person> getPersonsByTeam(String teamName); 
} 

然后,我可以要求从SRC哪来春的任何地方这个接口的实现正在“应用”。假设我需要它在服务层:

class MyService { 
    @Autowired 
    IPersonDao svc; 
} 

或在测试类:

class TestPersonDao { 
    @Autowired 
    IPersonDao svc; 

    @Test 
    void testGetPersons(){ 
    List<Person> persons = svc.getPersonsByTeam("billing"); 
    Assert.assertDataSet(persons, "billing.xml"); 
    } 
} 

此外,我的DAO实现可以隐藏数据访问的复杂性不与道合同搞乱。如果我需要一个Hibernate的Session或持久性管理器,我只是宣布:

class JpaPersonDao implements IPersonDao { 

@PersistenceContext 
EntityManager em; 

    List<Person> getPersonsByTeam(String tm) { 
    em.createQuery("..."); 
    } 
} 

组件化的类要求以电汇合作豆注册表。这可以通过手工开发,但已经有DI框架可以做到这一点。此外,Spring还有很多其他的东西,比如异常转换,对方面编程的支持,mvc框架,portlet框架,与hibernate的集成,jpa和/或其他db堆栈,当然这些与Spring IoC的东西很好地集成在一起。

1

春天不仅仅是一个DI框架。还有很多,这将使你编程更容易地区:

  • JDBC,Hibernate中,JMS模板(大大减少代码行数)
  • 看点编程
  • 安全(春季安全)
  • 春天MVC
  • 的Spring Web服务

这些只是一些例子 - 还有更多。你不必使用上面的任何一个,但是有一个成熟,设计良好的框架的一部分,通常它们使事情变得更简单。

Spring的核心当然是依赖注入。对于小型项目,使用DI框架的好处可能并不明显,但对于大型复杂项目而言,这一点并不明显。 Martin Fowler非常清楚地解释了Inversion of Control。当然还有其他的选择(例如Guice),但我会说Spring现在是一个行业标准。

+0

我也从Ruby on Rails背景学习Spring,并且对Spring解决的问题印象深刻。 微软世界正在做什么?他们也有这样的框架吗?有NHibernate,但有官方的NSpring或者任何这样的计划? – 2009-04-25 05:35:49

2

我写了一篇关于为什么人们使用依赖注入框架(如Spring和Google Guice)的说明。大多数教程忽略了这一点,但恕我直言,这是最重要的事情。

如果您了解您遇到的问题以及所有这些模式/框架解决的问题,那么您才能够制作出优秀的软件和优秀的架构选择。

读到它在这里:http://www.redcode.nl/blog/2010/01/dependency-injection-dissection

2

简单地说,你申请依赖注入编写干净,可测试的代码。同样作为回报,你实现了一个设计,调用者知道使用哪个实现(注入)而不是被调用者(这就是着名的“好莱坞原则”)。现在如果你不使用像Spring和Guice这样的使用DI框架,你可以尝试使用工厂来实现依赖注入。但是,测试时,工厂会花费代码样本和不安的清理。有些人还在这些框架中发现了其他优势,这些优势是它们与属于Struts,Hibernate等不同层的框架的轻松集成。