spring的构造函数注入属性@ConstructorBinding用法

 更新时间:2023年12月15日 14:27:49   作者:搏·梦  
这篇文章主要介绍了关于spring的构造函数注入属性@ConstructorBinding用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

前言

前情回顾:

实体类使用@Builder,导致@ConfigurationProperties注入属性失败

根据上一篇文章,引出如下问题:

先说结论

@ConstructorBinding注解:这个注解是SpringBoot在2.2发行版中添加的,添加该注解的属性配置类不再需要添加Setter方法,但是需要添加构造函数,根据构造函数进行实例化属性配置类

使用@ConstructorBinding,该类得拥有 有参的构造函数方法,才可以赋值成功。

@ConstructorBinding注解的类,此类不能加@Component类似声明该类为bean对象的注解,因为spring创建bean的时候,有种方式叫构造函数创建bean,如果此类加上@Component,构造函数的参数,则都是去单例池中找对象并注入

回答上一篇问题:

  • 使用该@ConstructorBinding注解,进行构造函数方法注入属性,可以不用set方法,因此完全可以不用提供set方法。
  • 如果不想提供无参的构造函数方法,使用@Builder,因为@Builder可以把无参构造函数给抹杀掉,拥有全参构造函数,再配合@ConstructorBinding即可,属性注入。

快速入门

// @EnableConfigurationProperties的具体使用方式可以看如下:
// https://blog.csdn.net/xueyijin/article/details/124072389
@Component
@EnableConfigurationProperties(demoFailedTest.class)
@ToString
public class demoFailedConfig {
    @Autowired
    private demoFailedTest demoFailedTest;
}

@ToString
@ConfigurationProperties(prefix = "failed.test")
@ConstructorBinding
@AllArgsConstructor
public class demoFailedTest {

    private String username;
    private int age;
    private demoPerson demoPerson;

}

@ToString
@AllArgsConstructor
@ConstructorBinding
public class demoPerson {
    private String name;
    private String sex;
}

@Component("demoFailedTestRunner")
public class demoRunner implements ApplicationRunner {

    @Autowired
    demoFailedConfig demoFailedConfig;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(demoFailedConfig);
    }
}

运行结果图:

其他情况案例

1.属性不在构造函数的参数列表中

无法被注入

@Component
@EnableConfigurationProperties(demoFailedTest.class)
@ToString
public class demoFailedConfig {

    @Autowired
    private demoFailedTest demoFailedTest;
}

@ToString
@ConfigurationProperties(prefix = "failed.test")
@ConstructorBinding
public class demoFailedTest {

    private String username;
    private int age;
    private demoPerson demoPerson;

	// 少了age属性
    public demoFailedTest(String username, com.example.csdn.configuration_failed_test.demoPerson demoPerson) {
        this.username = username;
        this.demoPerson = demoPerson;
    }
}

@ToString
@ConstructorBinding
public class demoPerson {
    private String name;
    private String sex;

	// 少了name属性
    public demoPerson(String sex) {
        this.sex = sex;
    }
}

@Component("demoFailedTestRunner")
public class demoRunner implements ApplicationRunner {

    @Autowired
    demoFailedConfig demoFailedConfig;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(demoFailedConfig);
    }
}

2.使用@ConstructorBinding的类上再使用@Component注解

会报错

@Component
@EnableConfigurationProperties(demoFailedTest.class)
@ToString
public class demoFailedConfig {
    @Autowired
    private demoFailedTest demoFailedTest;
}

@Component
@ToString
@ConfigurationProperties(prefix = "failed.test")
@ConstructorBinding
@Builder
public class demoFailedTest {
    private String username;
    private int age;
    private demoPerson demoPerson;
}

@ToString
@ConstructorBinding
@Builder
public class demoPerson {
    private String name;
    private String sex;
}


@Component("demoFailedTestRunner")
public class demoRunner implements ApplicationRunner {

    @Autowired
    demoFailedConfig demoFailedConfig;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(demoFailedConfig);
    }
}

可以从报错信息看出来,spring将该demoFailedTest类执行构造函数方法的时候,当成创建该类的单例bean对象,因此,该构造函数所需的参数,必然是从单例池中去找,显示是没有String类型的单例对象,所以报错了。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • IntelliJ IDEA2023中运行Spring Boot找不到VM options进行端口的修改的问题解决

    IntelliJ IDEA2023中运行Spring Boot找不到VM options进

    这篇文章主要介绍了IntelliJ IDEA2023中运行Spring Boot找不到VM options进行端口的修改的问题解决,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • Token登陆验证机制的原理及实现

    Token登陆验证机制的原理及实现

    这篇文章介绍了Token登陆验证机制的原理及实现,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • spring BeanProcessor接口详解

    spring BeanProcessor接口详解

    这篇文章主要介绍了spring BeanProcessor接口的相关资料,帮助大家更好的理解和学习使用spring,感兴趣的朋友可以了解下
    2021-03-03
  • idea自带Jacoco/idea自动测试语句覆盖率方法(使用详解)

    idea自带Jacoco/idea自动测试语句覆盖率方法(使用详解)

    这篇文章主要介绍了idea自带Jacoco/idea自动测试语句覆盖率方法,本文给大家分享使用方法,通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 详解Java ThreadPoolExecutor的拒绝策略

    详解Java ThreadPoolExecutor的拒绝策略

    这篇文章主要介绍了Java ThreadPoolExecutor的拒绝策略,本文对于线程的池的几种策略进行详细的讲解,在实际的生产中需要集合相关的场景来选择合适的拒绝策略,需要的朋友可以参考下
    2022-08-08
  • Java序列化(Serialization) 机制

    Java序列化(Serialization) 机制

    本篇文章是对Java中对象的序列化(Serialization) 机制进行了详细的分析介绍,并附实例,需要的朋友可以参考下
    2016-07-07
  • java根据模板动态生成PDF实例

    java根据模板动态生成PDF实例

    本篇文章主要介绍了java根据模板动态生成PDF实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Java微服务实战项目尚融宝接口创建详解

    Java微服务实战项目尚融宝接口创建详解

    这篇文章主要介绍了Java微服务实战项目尚融宝的接口创建流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • 详解Servlet入门级设置(超详细 IDEA2020版)

    详解Servlet入门级设置(超详细 IDEA2020版)

    这篇文章主要介绍了详解Servlet入门级设置(超详细 IDEA2020版),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • RabbitMQ消息拒绝如何解决

    RabbitMQ消息拒绝如何解决

    这篇文章主要介绍了RabbitMQ消息拒绝如何解决问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01

最新评论