自从spring宣布不推荐使用字段注入后,我开始在我的项目中使用构造函数注入。实际上,代码感觉更漂亮,更严格,我可以接受。但我遇到了一个模式,对我来说有点...怪异和冗长:
我有一个抽象的服务bean类(带有@service
注释),它有2个依赖项,直接注入到构造函数中:
@Autowired
public AbstractService(DependencyA depA, DependencyB depB) {
this.depA = depA;
this.depB = depB;
}
然后,我有多个服务bean类(仍然使用@service
注释)扩展抽象服务。我不知道是否还有其他方法,但我发现在每个子类构造函数中注入父级的依赖关系有点冗长和重复:
@Service
public class ServiceA extends AbstractService {
private final DepC depC;
@Autowired
public ServiceA(DepA depA, DepB depB, DepC depC) {
super(depA, depB);
this.depC = depC;
}
}
我只是想知道这是不是正确的方法,你对此有什么看法?
我的回答集中在你问题中“冗长和重复”的部分;我让别人来决定你对注释的用法有多“正确”。
即使有了spring和它的DI框架,到头来我们说的还是Java源码!
在Java中,如果基类只提供一个包含一些a和B的构造函数;那么当然您的子类必须进行一个调用super(a a,B B);当然,这些值a和b一定是从某个地方来的!
所以,你所说的“冗长重复”是使用Java的直接后果。
换句话说:没有办法避开那个部分!
abstractservice
上的@autowired
不执行任何操作。将其更改为:
@Service
public class ServiceA extends AbstractService {
private final DepC depC;
@Autowired
public ServiceA(DepA depA, DepB depB, DepC depC) {
super(depA, depB);
this.depC = depC;
}
}
...
public AbstractService(DependencyA depA, DependencyB depB) {
this.depA = depA;
this.depB = depB;
}
我可以接受这个设置。
对我来说,使用构造函数注入的主要好处是告知开发人员什么是外部依赖关系。我发现它在编写单元测试时很有用。在编写mocks时,您只需要知道需要嘲弄什么。
另一个好处是突出显示当一个类有太多的依赖项时,它给出了重构可能是有序的暗示。
另一种方法是使用setter注入(同时保留信息方面),但我已经逐渐喜欢构造函数注入。
请帮助理解在哪种情况下我应该使用构造函数注入和设置器注入。请帮我举个合适的例子。 先谢谢你。
问题内容: 我有一个类A,并写了一个子类B。A只有一个参数化的构造函数。B必须调用A的这个超级构造函数。现在,我想使用一个Object作为参数。该对象应调用B的方法。因此,参数对象必须持有B的引用,或者必须是内部类。 现在,当我想调用构造函数时,……Eclipse说: 在显式调用构造函数时无法引用“ this”或“ super” 我唯一想解决的是设置方法,将“ this”实例注入到参数对象中。我不
我把下面的内容看做是构造函数和setter注入的区别之一。有人能用一些简单的例子解释一下下面的区别吗,我对术语完全功能对象和不完全对象有点困惑。 -
问题内容: 在所有其他与super构造函数一起使用的语言中,都是隐式调用的。如何在Python中调用它?我希望这是行不通的。 问题答案: super()在新样式类中返回类似父对象的对象:
我有课 我还有一个B级 lombok抛出错误,说它找不到()构造函数,显式调用它。我想让lombok做的是给类b提供注释,这样它就生成了以下代码: 我们在龙目岛有注释吗?
大家都知道@Autowired(@Inject etc)注释是由AutowiredAnnotationBeanPostProcessor处理的。它解析并设置用@Autowired注释的字段和setter,但构造函数呢?这是bean后处理器,这意味着它是在已经创建bean之后调用的,但是构造函数也可以标记为@Autowired,那么如何创建这样的bean呢?