Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 再次使用Autowire Bean还是使用getter?_Java_Spring - Fatal编程技术网

Java 再次使用Autowire Bean还是使用getter?

Java 再次使用Autowire Bean还是使用getter?,java,spring,Java,Spring,我有一个抽象类,它自动连接一些bean,例如存储库: public abstract class A { @Autowired private ARepository aRepository; protected void useRepository() { aRepository.doSomething(); } } 这个抽象类将该存储库用于某种方法。现在我还有一个子类,它扩展了classa,还有一个方法,它使用了ARepository pu

我有一个抽象类,它自动连接一些bean,例如存储库:

public abstract class A {
    @Autowired
    private ARepository aRepository;

    protected void useRepository() {
        aRepository.doSomething();
    }
}
这个抽象类将该存储库用于某种方法。现在我还有一个子类,它扩展了class
a
,还有一个方法,它使用了
ARepository

public class B extends A {

    private void useRepositoryAgain() {
        aRepository.doSomething();
    }
}
现在我的问题是:

我怎么看有两种方法可以做到这一点:

1:再次在类
B
中自动关联存储库:

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();
    }
}
在我的理解中,两者之间应该没有区别,因为再次自动连接存储库只会返回相同的实例


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

再次自动连接bean将不起作用。它将导致类
A
中的成员变量
aRepository
变为
null
。Spring将只自动关联类
B
中的成员变量,而不自动关联
A
中的成员变量

相反,只在类
A
中自动连接它,而不在类
B
中自动连接,并使其
受保护
,而不是类
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();
    }
}

有道理,谢谢。您建议使用这种方法,而不是将字段私有化并创建getter,这有什么原因吗?我认为这是最好的方法。@Niby你也可以将其设置为
private
并添加一个
protected
getter方法,我认为这更多是个人偏好/风格的问题。我自己不喜欢添加不必要的getter方法。