gpt4 book ai didi

java - 再次使用 Autowire Bean 还是使用 getter?

转载 作者:行者123 更新时间:2023-11-30 02:01:16 28 4
gpt4 key购买 nike

我有一个抽象类,它 Autowiring 一些bean,例如存储库:

public abstract class A {
@Autowired
private ARepository aRepository;

protected void useRepository() {
aRepository.doSomething();
}
}

这个抽象类使用该存储库来实现某些方法。现在我还有一个子类,它扩展了类 A 并且还有一个使用 ARepository 的方法。

public class B extends A {

private void useRepositoryAgain() {
aRepository.doSomething();
}
}

现在我的问题:

我认为有两种方法可以做到这一点:

1:再次在类 B 中 Autowiring 存储库:

public class B extends A {
@Autowired
private ARepository aRepository;
...
}

2:在A类中创建getter方法:

public abstract class A {
...
public ARepository getARepository() {
return this.aRepository;
}
}

public class B extends A {

private void useRepositoryAgain() {
getARepository().doSomething();
}
}

根据我的理解,两者之间不应该有区别,因为再次 Autowiring 存储库只会返回它的相同实例。

我的理解是否正确,或者我缺少的两种方法之间是否存在显着差异?

最佳答案

再次 Autowiring bean 将不起作用。它会导致A类中的成员变量aRepositorynull。 Spring只会 Autowiring 类B中的成员变量,而不是A中的成员变量。

相反,仅在类 A 中 Autowiring 它,而不是在类 B 中,并使其成为 protected 而不是 private 位于类 A 中,以便子类 B 中的方法也可以访问它:

public abstract class A {
@Autowired
protected ARepository aRepository;

protected void useRepository() {
aRepository.doSomething();
}
}

public class B extends A {

private void useRepositoryAgain() {
// Fine, since aRepository is protected in the superclass
aRepository.doSomething();
}
}

关于java - 再次使用 Autowire Bean 还是使用 getter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52755548/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com