@Autowired自动装载某类是如何选择调用此类的构造方法

最近在学习技术派项目时看到了一段代码:

 @Slf4j
@Component
public class UserSessionHelper {
    @Component
    @Data
    @ConfigurationProperties("paicoding.jwt")
    public static class JwtProperties {
        /**
         * 签发人
         */
        private String issuer;
        /**
         * 密钥
         */
        private String secret;
        /**
         * 有效期,毫秒时间戳
         */
        private Long expire;
    }

    private final JwtProperties jwtProperties;

    private Algorithm algorithm;
    private JWTVerifier verifier;

    public UserSessionHelper(JwtProperties jwtProperties) {
        this.jwtProperties = jwtProperties;
        algorithm = Algorithm.HMAC256(jwtProperties.getSecret());
        verifier = JWT.require(algorithm).withIssuer(jwtProperties.getIssuer()).build();
    }
 }

UserSessionHelper这个类只有一个有参构造方法,在自动注入的时候并没有传入参数,他是如何调用的这个构造方法呢,且听我慢慢道来:
一个类中可以有多个构造函数,如果你不显示的写出,那么就会隐式的调用无参构造函数,当你显示的写出构造函数时,那么就会调用你写的这个构造函数而不再调用无参构造函数,UserSessionHelper类中已经写出了一个有参的构造函数,那么这个有参构造函数的参数是如何传入的呢,我们看JwtProperties这个内部类,它使用了static进行修饰,且添加了@Component注解,这代表当UserSessionHelper被加载时JwtProperties类也会随之而进行加载,且交给了spring进行管理,当你使用@Autowired注解进行自动装配时,spring就会调用UserSessionHelper的有参构造函数,且因为JwtProperties已经交给了spring进行管理,spring会自动的将JwtProperties传入到UserSessionHelper的有参构造函数中,整个过程就完成了

以下为我在其他地方的文章中看到的总结:

  • 针对于@Autowired注解实例化bean选用构造器的几种情况:
  • 一、没有在构造器上添加@Autowired注解
  • (1)只有无参构造 -----使用无参构造
  • (2)只有一个有参构造 -----使用的是有参构造,但是有参构造的形参类型必须要被spring管理,否则编译报错
  • (3)有多个有参构造 -----编译报错
  • (4)既有无参构造又有多个有参构造 -----使用无参构造
  • 二、在构造器上添加@Autowired注解
  • (1)存在一个无参和一个有参构造,@Autowired加在无参构造 -----使用无参构造
  • (2)存在一个无参和一个有参构造,@Autowired加在有参构造 -----使用的是有参构造
  • (3)存在一个无参和一个有参构造,@Autowired加在两个上面 -----编译报错,提示注解只能加在某一个构造器上
  • (4)存在一个无参和一个有参构造,@Autowired加在两个上面,但只有一个填写required = false -----运行报错
  • (5)存在一个无参和一个有参构造,@Autowired加在两个上面,两个都填写required = false -----使用有参构造
  • (6)存在一个无参和两个有参构造,@Autowired加在三个上面,三个都填写required = false -----使用形参个数多的构造器

以上为个人浅薄见解,如有错误,欢迎指正,感谢大家。
祝安

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值