2017-09-19 29 views
2

哪一个Bean定义是最佳实践,为什么?哪种方法是最佳实践?

对于一个示例,类型1可以用于单元测试而不创建上下文。

1型

public class MovieRecommender { 

    private final CustomerPreferenceDao customerPreferenceDao; 

    @Autowired 
    public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) { 
     this.customerPreferenceDao = customerPreferenceDao; 
    } 

    // ... 

} 

2型

public class MovieRecommender { 

    @Autowired 
    public CustomerPreferenceDao customerPreferenceDao; 


    // ... 

} 

回答

1

我想说的第一个是更好的。

为什么我会使用它的主要原因是,设置测试更容易和更干净。您只需创建嘲笑的依赖关系并将其传递给待测组件的构造器。

从Spring 4.3开始,具有单个构造函数的类可以省略@Autowired 注释。

所以,你可以这样写:

public class MovieRecommender { 

    private final CustomerPreferenceDao customerPreferenceDao; 

    public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) { 
     this.customerPreferenceDao = customerPreferenceDao; 
    } 

    // ... 

} 

还有一招。如果你将它与来自Lombok的@AllArgsConstructor一起使用,那么你也不必编写构造函数(与场注入相同),并且你也有易于测试的构造函数。

@AllArgsConstructor 
public class MovieRecommender { 

    private final CustomerPreferenceDao customerPreferenceDao; //injected 

} 

所以,如果你使用龙目岛,我会去与构造注入+ AllArgsConstructor

还有一些关于这issue伟大的文章。

4

我会说第一个。这不仅是因为事实上,你可以很容易地测试,但因为一个简单的规则

在它的构造函数的最后一个对象应该具有everythig它需要实际执行其任务

(我对不起,我不记得我在哪里看过:(无论如何,我认为这是一条很好的规则)

因此,通过实施类似第二种方式,您可以创建实例,不会有他们所需要的。你必须实例化它和设置其依赖关系。如果你忘记了最后一部分会发生什么?

所以这就是为什么我总是建议更换构造注入和设置依赖关系final因此它不会编译除非你在构造函数中

2

相传构造函数依赖注入应优于场依赖注入进行设置由于你提到的原因:你不能测试它作为一个普通的POJO。

在展开构造讨论VS setter方法依赖注入具体根据documentation

[..]它是一个好的经验规则来使用强制 依赖性和setter方法或构造的构造可选 依赖

0

方法我会建议2型

因为反正你使用注释注入依赖于类,这是通过使用反射API进行 ..

因此,有没有使用过的构造函数初始化...

如果你不”不想使用按规定意味着注释,然后使用 -

如果你正在经历setter方法创建对象后改变(初始化)值,然后再进行setter注入..

setter注入覆盖其与构造器注入初始化如果两个注射可用..

0

第一个(也称为构造器依赖注入),主要是因为其更容易测试属性的值。如果你想模拟customerPreferenceDao,你可以嘲笑它并将它注入到MovieRecommender的一个实例中。它可以让你更好地控制你正在做的事情。