真正的问题是为什么我可以通过以下两种方式编写此代码:
@Controller
public class PostController {
@Autowired
private PostService postService;
@Autowired
private CommentService commentService;
....
}
和
@Controller
public class PostController {
private PostService postService;
private CommentService commentService;
@Autowired
public PostController(PostService postService, CommentService commentService){
this.postService = postService;
this.commentService = commentService;
}
....
}
这些片段是否完全相同?推荐哪一个?
答案 0 :(得分:2)
第一个解决方案直接使用反射注入值(基本上JVM将获取您的对象并手动设置值)。
第二个解决方案使用构造函数,这意味着该参数是必需的。另外,在将自己分配给属性之前,您有时间玩上述值。 (请注意,构造函数也将通过反射调用)。
另一种方法是使用setter,这次调用一个方法来设置值,这样你就可以在实际设置它之前使用它,但它不是必需的(因为它不是构造函数的一部分)。
关于推荐的那个,我不确定实际上有一个“官方推荐”,但我倾向于仅对非必填字段使用构造函数注入强制字段和setter注入。但据我所知,这主要取决于你工作的团队或你的品味。
答案 1 :(得分:1)
你可以用两种不同的方式编写它们,因为Spring决定支持这两种方法从应用程序上下文中注入bean(甚至还有第三种!)。
他们将在大多数时间做同样的事情。但每个人在工作方式上都有微妙的差异。请查看documentation以获得进一步说明,因为可以在那里更好地解释分钟详情。
答案 2 :(得分:0)
我希望在PostController中的构造函数返回后注入第一个示例中的依赖项。在第二个例子中,我希望在构造函数执行时注入依赖项。即,第二个例子将保证依赖性在那里,因为构造函数执行第一个例子不会。
答案 3 :(得分:0)
从测试的角度来看,它们并不相同。 除非你有PostService和CommentService的setter方法,否则你不能轻易设置它们的值。
通常对于@Autowired,它设置为包范围 而不是
@Autowired
private PostService postService;
我们
@Autowired
PostService postService;
请注意没有“私人”。
这样做的理由是...... 只有具有相同包的类才能读/写变量,当您执行测试类时,通常它与被测单元位于同一个包中。