最近在学习技术派项目时看到了一段代码:
@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 -----使用形参个数多的构造器
以上为个人浅薄见解,如有错误,欢迎指正,感谢大家。
祝安