首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring @Autowired字段-哪个访问修饰符,私有还是包-私有?

Spring @Autowired字段-哪个访问修饰符,私有还是包-私有?
EN

Stack Overflow用户
提问于 2013-10-30 12:29:59
回答 5查看 26K关注 0票数 23

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

问题-访问修饰符应该是什么,private还是package-private (即无)?

例如:

代码语言:javascript
复制
public class MyClass {
    @Autowired
    private MyService myService;
}

vs

代码语言:javascript
复制
public class MyClass {
    @Autowired
    MyService myService;
}

在第一种情况下(private字段),Spring使用反射连接字段,即使它没有setter。

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

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-10-30 12:41:43

第一种情况还允许您根据框架注入模拟。例如,使用Mockito的@InjectMocks注释。春季测试也有ReflectionTestUtils.setField,.

就我个人而言,我不太喜欢为测试目的修改类,所以我会选择第一种情况。但最终,这主要取决于您喜欢的测试框架。

票数 7
EN

Stack Overflow用户

发布于 2013-10-30 12:44:49

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

我认为属性应该是private

代码语言:javascript
复制
@Autowired
private MyService myService;

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

为了测试目的,注入mocks of private properties将与package-private属性的工作方式相同。

例如,使用Mockito,您可以将private MyService的模拟注入MyClass,如下所示:

代码语言:javascript
复制
public class MyClassTest {

    @Mock
    MyService service;

    @InjectMocks
    MyClass serv = new MyClass();

    @Before
    public void init() {
    MockitoAnnotations.initMocks(this);
    }
}
票数 10
EN

Stack Overflow用户

发布于 2013-10-30 12:43:08

我通常更喜欢使用字段私有和使用setter注入:

代码语言:javascript
复制
public class MyClass {

    private MyService myService;

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

允许该服务为@Autowired,但设置为一个模拟实例进行单元测试。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19682293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档