构造器注入和Setter注入是依赖注入(Dependency Injection,DI)中两种常见的方式,用于向一个对象注入其所依赖的其他对象或数值。这两种注入方式有各自的特点和用途。
在构造器注入中,依赖关系通过类的构造函数传递。这意味着在创建对象时,依赖的对象实例会作为构造函数的参数传递进来。
示例(Java):
public class UserService {
private UserRepository userRepository;
// 构造器注入
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
// 其他方法使用userRepository
}
优点:
在Setter注入中,依赖通过类的setter方法进行注入。这意味着你可以在对象创建后随时改变依赖关系。
示例(Java):
public class UserService {
private UserRepository userRepository;
// Setter注入
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
// 其他方法使用userRepository
}
优点:
在实践中,有时也可以使用构造器注入和Setter注入的组合,以满足不同的需求。
Spring Framework是一个流行的Java开发框架,它提供了丰富的功能,包括依赖注入(Dependency Injection)的支持。Spring对构造器注入和Setter注入都提供了良好的支持,而且在不同版本中,它并没有显著改变对这两种注入方式的看法。当前版本Spring Framework更推荐通过构造方法注入Bean。
来自“Constructor-based or setter-based DI”
“The Spring team generally advocates constructor injection, as it lets
you implement application components as immutable objects and ensures that required dependencies are not null.
Spring团队通常提倡构造函数注入,因为它允许
将应用程序组件实现为不可变对象,并确保所需的依赖项不为空。
Furthermore, constructor-injected components are always returned to the client (calling) code in a fully initialized state. As a side note, a large number of constructor arguments is a bad code smell, implying that the class likely has too many responsibilities and should be refactored to better address proper separation of concerns.
此外,构造器注入的组件总是以完全初始化的状态返回给客户端(调用)代码。顺便说一句,大量的构造函数参数是一种不好的代码气味,这意味着类可能有太多的职责,应该重构以更好地解决适当的关注点分离问题。
Setter injection should primarily only be used for optional dependencies that can be assigned reasonable default values within the class. Otherwise, not-null checks must be performed everywhere the code uses the dependency. One benefit of setter injection is that setter methods make objects of that class amenable to reconfiguration or re-injection later.
Management through JMX MBeans is therefore a compelling use case for setter injection.”
Setter注入应该主要只用于可选的依赖项,这些依赖项可以在类中被分配合理的默认值。否则,必须在代码使用依赖项的任何地方执行非空检查。setter注入的一个好处是,setter方法使该类的对象可以在以后重新配置或重新注入。
因此,通过JMX MBeans进行管理是setter注入的一个引人注目的用例。”
总结以上论点就是:
关于我
你好,我是Debug.c。微信公众号:种颗代码技术树 的维护者,一个跨专业自学Java,对技术保持热爱的bug猿,同样也是在某二线城市打拼四年余的Java Coder。
在掘金、CSDN、公众号我将分享我最近学习的内容、踩过的坑以及自己对技术的理解。
如果您对我感兴趣,请联系我,
⭐️若有收获,就点个赞吧。
⛰若喜欢文中配图,请联系我,我发您原图。