⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 网络 「网络」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

先看代码:

@RestController
@RequestMapping("/test")
public class TestController {

private final TestService testService;
// @Autowired

public TestController(TestService testService) {
this.testService = testService;
}

@RequestMapping("/sayHello")
public String sayHello() {
return testService.sayHello();
}
}

@Autowired并不是必须的,不加也能注入成功,这是为什么?

在 Spring4.x 中增加了新的特性:如果类只提供了一个带参数的构造方法,则不需要对对其内部的属性写 @Autowired 注解,Spring 会自动为你注入属性。

前言

因为业务关系也看了些同事写的代码,因为公司没有明确规定,有一部分人在注入依赖的时候使用了用Spring推荐的构造器注入的方式,一部分人使用了@Autowired的注解进行注入。

因此,接下来我试着总结归纳一下相关的情况,做一次回顾。

用自己的话去说出来才算是真的掌握。

使用介绍

1.@Autowired注入

@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private List<TestService> testServices;
@Autowired
private List<ChainAsbtract> chains;

private ChainAsbtract target;

}

2.构造器注入

Spring4.3+之后,constructor注入支持非显示注入方式。

@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注入

@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

官方推荐理由

  • 单一职责: 当使用构造函数注入的时候,你会很容易发现参数是否过多,这个时候需要考虑你这个类的职责是否过大,考虑拆分的问题;而当使用@Autowired注入field的时候,不容易发现问题
  • 依赖不可变: 只有使用构造函数注入才能注入final
  • 依赖隐藏:使用依赖注入容器意味着类不再对依赖对象负责,获取依赖对象的职责就从类抽离出来,IOC容器会帮你自动装备。这意味着它应该使用更明确清晰的公用接口方法或者构造器,这种方式就能很清晰的知道类需要什么和到底是使用setter还是构造器
  • 降低容器耦合度: 依赖注入框架的核心思想之一是托管类不应依赖于所使用的DI容器。换句话说,它应该只是一个普通的POJO,只要您将其传递给所有必需的依赖项,就可以独立地实例化。这样,您可以在单元测试中实例化它,而无需启动IOC容器并单独进行测试(使用一个可以进行集成测试的容器)。如果没有容器耦合,则可以将该类用作托管或非托管类,甚至可以切换到新的DI框架。

另外,在使用构造器的使用能避免注入的依赖是空的情况。

因为在bean的生命周期里面先执行的是bean的构造器,然后才给bean里面的属性赋值。具体内容在bean的生命周期里面,后面我学习之后按照自己的理解写写。

文章目录
  1. 1. 前言
  2. 2. 使用介绍
    1. 2.0.1. 1.@Autowired注入
    2. 2.0.2. 2.构造器注入
    3. 2.0.3. 3.setter注入
  • 3. 官方推荐理由