专业的JAVA编程教程与资源

网站首页 > java教程 正文

spring注入bean:构造函数注入(spring 构造函数注入)

temp10 2024-10-17 16:21:52 java教程 11 ℃ 0 评论

在 Spring boot 开发过程当中,最常见的就是依赖注入,简单梳理一下相关知识点,作为记录。

注解

  • @Autowired 是由Spring 框架提供
-- 不建议使用基于 field 的注入方式。
Field injection is not recommended 
例子:
class MyComponent {
  @Inject MyCollaborator collaborator; // 注入失败

  public void myBusinessMethod() {
    collaborator.doSomething(); // 空指针异常
  }
}
 
class MyComponent {

  private final MyCollaborator collaborator;

  @Inject
  public MyComponent(MyCollaborator collaborator) {
    // 通过断言的方式
    Assert.notNull(collaborator, "MyCollaborator must not be null!");
    this.collaborator = collaborator;
  }

  public void myBusinessMethod() {
    collaborator.doSomething(); // 安全的
  }
}
  • @Resource 是JSR-250定义的注解,
  • 两个重要的属性:name和type,而Spring 将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。
    • @Injec 是 JSR-330 定义的规范,Spring 的环境下,@Inject和@Autowired 作用基本是一样的。

    注入方式
    Spring常见的三种注入方式:

    • field注入
    @Autowired
    private DemoService demoService;

    这种注入方式非常的简单。

    spring注入bean:构造函数注入(spring 构造函数注入)

    首先网上说的循环依赖的问题,spring 在启动的时候会检查的,可以自己去测试一下。

    • 构造器注入
    private final DemoService demoService1;
    @Autowired
    public DemoController(DemoService demoService1) {
        this.demoService1 = demoService1;
    }
    • setter注入
    private DemoService demoService2;
    @Autowired
    public void setDemoService(DemoService demoService2) {
        this.demoService2 = demoService2;
    }

    推荐使用构造函数注入

    代码质量:

      • 使用 field 注入非常简单,但是造成了一个问题,如果你注入很多变量,此时是无法发现代码异味的。
      • 构造器注入,当你发现存在一个巨大的构造器时,这个时候就需要考虑单一职责问题了。

    依赖不可变:final关键字

    依赖不为空

      • controller 实例化时,由于已经实现了有参数的构造函数,所以不会调用默认构造函数。
      • Java类加载实例化的过程中,spring 必须要传入 controller 所需要的参数,此时保障了参数不能为空。

    本文暂时没有评论,来添加一个吧(●'◡'●)

    欢迎 发表评论:

    最近发表
    标签列表