其实在工做中使用了Spring这么久,有不少的细节是值得使用者去思考的。如今笔者想针对Spring依赖注入的@Autowired总结一些想法。最近笔者看到一则实践建言,建议Spring的依赖注入采用构造器的方式(下面会提到)。看到这条,难免心中会有疑惑,为何?spring
先让咱们来总结下,@Autowired的使用方式有哪些。根据文档上的说明,@Autowired注解有三种经常使用方式。一种是在构造器的前面使用,后续咱们简称为“constructor方式”;一种是在setter方法前面使用,后续简称为“setter方式”;最后一种是直接在声明的类属性上使用,后续简称“field方式”。wordpress
相信看过Spring依赖注入示例代码、项目源码的人,对笔者上面提到的三种方式不会陌生,应该都有所见闻,并且应该知道@Autowired默认是依据类型来进行注入的。既然提供了三种方式,为何那条建言推荐使用constructor方式呢?工具
笔者查阅了几篇相关的歪果仁所写的博客及帖子,其实能够发现不少人对这三种方式的对比和取舍早已争论不休,笔者大体总结了几方面。测试
@Service public ProductionService { private final UserService userService; @Autowired public ProductionService(UserService userService){ this.userService = userService; } //...省略 }
优点:this
劣势:.net
@Service public ProductionService { private UserService userService; @Autowired public void setUserService(UserService userService) { this.userService = userService; } //...省略 }
优点:code
劣势:对象
@Service public ProductionService { @Autowired private UserService userService; //...省略 }
优点:文档
劣势:get
综上所述,@Autowired的三种用法其实没有所谓的孰优孰劣,笔者也就不在此提倡哪一种用法被喷了。使用者须要根据具体的应用场景,例如可变性的要求、“重塑性”的须要、测试时的方便、代码结构合理性等等因素吧,采用适合本身的方式。
笔者在作上述内容的思考时,想到了另一个“话题”,不在本篇中叙述了,否则有些跑题。能够先抛个引子,在后续博文中探讨。“假设采用field方式注入bean,又想保证不可变性的话,可否把属性设为final呢?”
https://steveschols.wordpress.com/2012/06/05/i-was-wrong-constructor-vs-setter-injection/