春季@Autowired字段 - 哪个访问修饰符,私有或包私有?

假设我们对类中的各种字段使用注释,并且我们没有编写也可以设置字段的 setter 或构造函数。@Autowired

问题 - 访问修饰符应该是什么,或者(即没有)?privatepackage-private

例如:

public class MyClass {
    @Autowired
    private MyService myService;
}

public class MyClass {
    @Autowired
    MyService myService;
}

在第一种情况下(场),Spring使用反射来连接场,即使它没有设置器。private

第二种情况(字段)允许我们能够访问这些字段(例如,设置模拟),如果我们需要扩展类以进行测试。package-private

因此,这两种情况都运行良好,但哪种情况更值得推荐,特别是在测试方面?


答案 1

因此,这两种情况都运行良好,但哪种情况更值得推荐,特别是在测试方面?

我认为属性应该是:private

@Autowired
private MyService myService;

因为使用 getter 方法来提供对属性的访问,而不是允许其他类直接访问它们,这总是很好的。

出于测试目的,注入将以与属性相同的方式工作。mocksprivate propertiespackage-private

例如,使用 ,您可以将 的模拟注入,如下所示:Mockitoprivate MyServiceMyClass

public class MyClassTest {

    @Mock
    MyService service;

    @InjectMocks
    MyClass serv = new MyClass();

    @Before
    public void init() {
    MockitoAnnotations.initMocks(this);
    }
}

答案 2

我通常更喜欢将现场私有化并使用二传手注射:

public class MyClass {

    private MyService myService;

    @Autowired
    public void setMyService(MyService myService) {
        this.myService = myService;
    }
}   

允许服务@Autowired,但使用模拟实例进行单元测试。


推荐