编辑
2023-04-19
Java
00
请注意,本文编写于 617 天前,最后修改于 617 天前,其中某些信息可能已经过时。

目录

使用@Autowired产生警告
1.Spring的注入方式
2.使用@Autowired修饰属性的缺点
3.处理方案
1. 使用setter注入
2. 通过构造方法注入
3. 结合@RequiredArgsConstructor使用

使用@Autowired产生警告

image.png 产生警告的原因: Spring团队建议:始终在bean中使用基于构造函数的依赖注入, 所以idea出现警告,让我们改正。

1.Spring的注入方式

  • 基于属性注入
  • 基于setter方法注入
  • 基于构造方法注入

2.使用@Autowired修饰属性的缺点

  1. 使用final修饰属性,可以防止值被更改,但@Autowired不能修饰final修饰的属性。

image.png

  1. 会导致程序与容器的紧耦合,必须通过容器创建对象,否则无法对私有属性进行赋值。
  2. 无法检测到bean循环依赖引起的启动异常。

3.处理方案

1. 使用setter注入

使用setter注入时,通过@Autowired修饰setter方法

java
import com.best.service.StudyService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; /** * @author : best * @date : 2023/4/19 * @description: @Autowired解决方案-修饰setter方法 */ @Controller public class StudyController { private StudyService service; @Autowired public void setStudyService(StudyService service) { this.service = service; } }

2. 通过构造方法注入

Spring团队推荐,通过构造方法注入

通过final修饰注入的属性,可以防止值被更改,程序更健壮

java
import com.best.service.StudyService; import org.springframework.stereotype.Controller; /** * @author : best * @date : 2023/4/19 * @description: @Autowired解决方案-构造参数注入 */ @Controller public class StudyController { private final StudyService service; public StudyController(StudyService service) { this.service = service; } }

3. 结合@RequiredArgsConstructor使用

适用于需要注入的属性多,对应的构造方法的参数就会比较多

使用Lombok的@RequiredArgsConstructor注解用于为final或者@NonNull修饰的属性生成对应的构造方法

java
import com.best.service.StudyService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; /** * @author : best * @date : 2023/4/19 * @description: @Autowired解决方案-RequiredArgsConstructor结合构造参数注入 */ @Controller @RequiredArgsConstructor public class StudyController { private final StudyService service1; private final StudyService service2; private final StudyService service3; }