@Autowired注释如何在Spring中运行?

时间:2012-02-14 17:20:51

标签: spring spring-mvc autowired

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

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

....
}

这些片段是否完全相同?推荐哪一个?

4 个答案:

答案 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;

请注意没有“私人”。

这样做的理由是...... 只有具有相同包的类才能读/写变量,当您执行测试类时,通常它与被测单元位于同一个包中。