Spring Boot之省略注入的情况总结

版权声明:本文章是作者辛勤书写的成果,如需转载,请与作者联系,并保留作者信息以及原文链接,谢谢~~ https://blog.csdn.net/blueheart20/article/details/81020504

@Autowired

Spring提供的标注,其基于容器自动寻找和加载特定的对象。其寻找和匹配的范围包括: @Component, @Bean, @Service, @Repository, @Controller等声明的对象。

使用方式

@Autowired可以用在属性、方法和构造函数上。查看其定义如下:

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
    /**
     * Declares whether the annotated dependency is required.
     * <p>Defaults to {@code true}.
     */
    boolean required() default true;
}

基于其标注定义,可以知道其使用的Target如上所示,几乎适用于各个场景。

某些场景下的省略

以下是基于构造方法的加载:

package com.example.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class DatabaseAccountService implements AccountService {
    private final RiskAssessor riskAssessor;

    @Autowired
    public DatabaseAccountService(RiskAssessor riskAssessor) {
        this.riskAssessor = riskAssessor;
    }
    // ...
}

以下是等价的自动加载方式:

@Service
public class DatabaseAccountService implements AccountService {
    private final RiskAssessor riskAssessor;
    public DatabaseAccountService(RiskAssessor riskAssessor) {
        this.riskAssessor = riskAssessor;
    }
    // ...
}

根据其官方说明

If a bean has one constructor, you can omit the @Autowired

于是这里就可以省略@Autowired。

还有其他类似省略的注入情况吗?

有,当然有,基于@Bean注解方法之时,如果方法中有参数的话,则自动进行注入加载。
示例如下:

@Configuration
class SomeConfiguration {
  @Bean
  public SomeComponent someComponent(Depend1 depend1,
                             @Autowired(required = false) Depend2 depend2) {
    SomeComponent someComponent = new SomeComponent();
    someComponent.setDepend1(depend1);
    if (depend2 != null) {
      someComponent.setDepend2(depend2);
    }
    return someComponent;
  }
}

在上述示例中,Depend1是自动注入的, Depend2是可选的注入,为了使用required=false的设置,则这里使用了@Autowired,默认情况下是无需使用的。

总结

在实际使用和开发中,需要注意构造方法以及@Bean方法调用的自动注入情况。

阅读更多

扫码向博主提问

bladestone

博客专家

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • 架构师
  • AI手工匠人
  • 攻城狮
  • Java老兵
  • 问题解决者
去开通我的Chat快问
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页