spring 使用@Autowired注入与使用构造函数注入区别
使用介绍
1.@Autowired注入
1 2 3 4 5 6 7 8 9 10 11 | @RestController @RequestMapping ( "/test" ) public class TestController { @Autowired private List<TestService> testServices; @Autowired private List<ChainAsbtract> chains; private ChainAsbtract target; } |
2.构造器注入
Spring4.3+之后,constructor注入支持非显示注入方式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | @RestController @RequestMapping ( "/test" ) public class TestController { // @Autowired private final List<TestService> testServices; // @Autowired private final List<ChainAsbtract> chains; // @Autowired public TestController(List<TestService> testServices, List<ChainAsbtract> chains) { this .testServices = testServices; this .chains = chains; } } |
3.setter注入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | @RestController @RequestMapping ( "/test" ) public class TestController { // @Autowired private final List<TestService> testServices; // @Autowired private final List<ChainAsbtract> chains; @Autowired public void setTestServices(List<TestService> testServices){ this .testServices = testServices; } @Autowired public void setTestServices(List<ChainAsbtract> chains){ this .chains = chains; } } |
事实上,spring在4.x版本后就推荐使用构造器的方式的来注入fileld
1 2 3 4 5 6 7 8 9 | 官方推荐理由 单一职责: 当使用构造函数注入的时候,你会很容易发现参数是否过多,这个时候需要考虑你这个类的职责是否过大,考虑拆分的问题;而当使用 @Autowired 注入field的时候,不容易发现问题 依赖不可变: 只有使用构造函数注入才能注入 final 依赖隐藏:使用依赖注入容器意味着类不再对依赖对象负责,获取依赖对象的职责就从类抽离出来,IOC容器会帮你自动装备。这意味着它应该使用更明确清晰的公用接口方法或者构造器,这种方式就能很清晰的知道类需要什么和到底是使用setter还是构造器 降低容器耦合度: 依赖注入框架的核心思想之一是托管类不应依赖于所使用的DI容器。换句话说,它应该只是一个普通的POJO,只要您将其传递给所有必需的依赖项,就可以独立地实例化。这样,您可以在单元测试中实例化它,而无需启动IOC容器并单独进行测试(使用一个可以进行集成测试的容器)。如果没有容器耦合,则可以将该类用作托管或非托管类,甚至可以切换到新的DI框架。 |
另外,在使用构造器的使用能避免注入的依赖是空的情况。
因为在bean的生命周期里面先执行的是bean的构造器,然后才给bean里面的属性赋值。
转载自:https://blog.csdn.net/smilecjw/article/details/107669224
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)