使用注释注入依赖项是否会消除dependency injection(外部配置)的主要好处?

我使用Spring,这是一个控制器:

@Controller public class PersonController { @Resource(name="PersonService") private PersonService personService; @RequestMapping(value = "/Person", method = RequestMethod.GET) public String getPersons(Model model) { // Retrieve all persons by delegating the call to PersonService List persons = personService.getAll(); // Attach persons to the Model model.addAttribute("persons", persons); //then return to view jsp } 

这是一项服务:

 @Service("personService") @Transactional public class PersonService { public List getAll() { //do whatever } } 

但是,要正确使用DI,我应该更改控制器以使用接口(?),如下所示:

 @Controller public class PersonController { @Resource(name="personService") private IPersonService personService; //Now an interface } 

这将允许我,例如,使用两个服务一个测试和一个实时。 我可以通过添加/删除服务上的注释来改变:

 @Service("personService") // this line would be added/removed @Transactional public class LivePersonService implements IPersonService { public List getAll() { //do whatever } } 

 @Service("personService") //this line would be added/removed @Transactional public class TestPersonService implements IPersonService { public List getAll() { //do something else } } 

但是,由于代码必须重新编译,所以失去了一个主要好处? 如果我使用xml查找,我可以动态改变依赖?

配置仍然是外部的,因为它位于您定义要注入哪个实现的位置之外 。 在类中,你只需硬编码类所依赖东西“名称” (这是好的,因为这种依赖是该类固有的)。

这就是说,您可以使用XML覆盖代码的注释以进行测试执行(您将拥有测试的特定XML应用程序上下文)并指定要注入的实现。

因此, 您无需更改代码即可运行测试。 看看这个答案 。

那是对的。 注释是源代码中的配置。 主要用于每个服务有一个课程。 如果您有特定接口的多个实现,那么XML将是更好的选择。 您还可以将XML配置与注释混合使用。

我上次从DI阵营听到的传统方式是,在unit testing中,你不应该使用DI框架。 相反,只需自己实例化模拟服务并将其设置为主机对象

 test() PersonController contr = new PersonController(); contr.personService = new TestPersonService(); // testing contr 

这被称为DI的第一个也是主要的成就,很大程度上是因为人们(像我这样)的困惑而没有得到它。 看看我以前的批评: 使用applicationcontext.getbean vs @configurable的优点

如果这个线程中的DI支持者反映了DI阵营中的新趋势,他们就不再那样进行unit testing; 相反,测试依赖于DI,具有测试特定的DI配置。 然后它与服务定位器模式没有什么不同。 如果DI的主要特征没有实际意义,那么重点是什么?

你的控制器类完美地说明了 它不能在Spring DI框架之外用作POJO。 没有关于它的POJO。 没人在乎,理所当然。 如果您的类依赖于服务定位器框架,则同样如此。

Spring bean框架提供了其他function,它们都不依赖于DI; 它们也可以在服务定位器框架中实现。 很多人在捍卫DI的设计模式时,实际上是在整个堆栈中捍卫Spring。 您实际上可以使用Spring作为服务定位器框架; Spring现在不会做广告,这对它的主要炒作点是一个打击; 但是,一旦炒作减弱,它必须吸引怀疑者。