真正的问题是为什么我可以通过以下两种方式编写此代码:

@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;
}

....
}

这些摘要是否相同?推荐哪一个?

最佳答案

第一个解决方案通过反射直接注入值(基本上,JVM将获取您的对象并手动设置值)。

第二种解决方案使用构造函数,这意味着该参数是必需的。另外,在将其自己分配给属性之前,您还有时间使用所述值。 (请注意,构造函数也将通过反射调用)。

另一种方法是使用setter,这一次调用一个方法来设置值,以便您可以在实际设置它之前就使用它,但这不是强制性的(因为它不是构造函数的一部分)。

关于推荐的一个,我不确定实际上是否有一个“官方推荐的”,但是我倾向于只对强制字段使用构造函数注入而对非强制字段只使用setter注入。但据我所知,这主要取决于您与之合作的团队或您的品味。

关于spring - @Autowired注释在Spring中如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9281309/

10-12 01:28