• SpringBoot中bean绑定


    目录

     

    自定义bean绑定

     导入第三方bean

     第三方bea通过配置文件注参数

    出现Prefix must be in canonical form

    @EnableConfigurationProperties()和@ConfigurationProperties的区别

    解除@ConfigurationProperties注解警告 

    @ConfigurationProperties的松散绑定


     

    自定义bean绑定

    在配置文件中写入

    1. servers:
    2. ipAddress: 192.158.0.1
    3. port: 1234
    4. detail: zhangsan

    定义一个实体类对象去接受这些属性

    1. import lombok.Data;
    2. import org.springframework.boot.context.properties.ConfigurationProperties;
    3. import org.springframework.stereotype.Component;
    4. @Data //lombok省去get/set/toString
    5. @Component //交给spring容器管理
    6. @ConfigurationProperties(prefix = "servers") //配置文件的位置,对应的属性注入
    7. public class ServerConfig {
    8. private String ipAddress;
    9. private int port;
    10. private String detail;
    11. }

     启动类下的

    1. import com.pojo.ServerConfig;
    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;
    4. import org.springframework.context.ConfigurableApplicationContext;
    5. @SpringBootApplication
    6. public class Springboot11ConfigurationApplication {
    7. public static void main(String[] args) {
    8. ConfigurableApplicationContext run = SpringApplication.run(Springboot11ConfigurationApplication.class, args);
    9. ServerConfig bean = run.getBean(ServerConfig.class);
    10. System.out.println(bean);
    11. }
    12. }

     导入第三方bean

    注入方式有许多,可以导入在写一个配置类, 然后加上@Bean即可,启动类中的@SpringBootApplication本身就是一个配置类。所以直接在这写也可以。

     导入druid坐标

    1. <dependency>
    2. <groupId>com.alibabagroupId>
    3. <artifactId>druidartifactId>
    4. <version>1.2.12version>
    5. dependency>

    启动类

    1. @SpringBootApplication
    2. public class Springboot11ConfigurationApplication {
    3. @Bean//注入
    4. public DruidDataSource druidDataSource(){
    5. DruidDataSource ds=new DruidDataSource();
    6. return ds;
    7. }
    8. public static void main(String[] args) {
    9. ConfigurableApplicationContext run = SpringApplication.run(Springboot11ConfigurationApplication.class, args);
    10. ServerConfig bean = run.getBean(ServerConfig.class);
    11. System.out.println(bean);
    12. DruidDataSource dds = run.getBean(DruidDataSource.class);
    13. System.out.println(dds);
    14. }
    15. }

    运行出来什么也没 

     第三方bea通过配置文件注参数

    application.yml下

    1. datasource:
    2. driverClassName: "com.mysql.jdbc.driver.zhkc"
    3. username: "张三"
    4. password: kczh

    启动类下 

    1. package com;
    2. import com.alibaba.druid.pool.DruidDataSource;
    3. import com.pojo.ServerConfig;
    4. import org.springframework.boot.SpringApplication;
    5. import org.springframework.boot.autoconfigure.SpringBootApplication;
    6. import org.springframework.boot.context.properties.ConfigurationProperties;
    7. import org.springframework.context.ConfigurableApplicationContext;
    8. import org.springframework.context.annotation.Bean;
    9. @SpringBootApplication
    10. public class Springboot11ConfigurationApplication {
    11. @Bean
    12. @ConfigurationProperties(prefix = "datasource")
    13. public DruidDataSource druidDataSource(){
    14. DruidDataSource ds=new DruidDataSource();
    15. return ds;
    16. }
    17. public static void main(String[] args) {
    18. ConfigurableApplicationContext run = SpringApplication.run(Springboot11ConfigurationApplication.class, args);
    19. // ServerConfig bean = run.getBean(ServerConfig.class);
    20. // System.out.println(bean);
    21. DruidDataSource dds = run.getBean(DruidDataSource.class);
    22. System.out.println(dds.getDriverClassName());
    23. System.out.println(dds.getUsername());
    24. System.out.println(dds.getPassword());
    25. }
    26. }

    运行结果 

    出现Prefix must be in canonical form

     这是因为prefix属性只能用小写,不能使用驼峰命名法,改成小写即可

    @EnableConfigurationProperties()和@ConfigurationProperties的区别

    @EnableConfigurationProperties开启对应的属性功能,可以通过配置中的属性,让我们对应的类名来做属性注入 ,这样也可以看出有哪些类通过spring去管理

    @ConfigurationProperties是做具体的属性绑定的,对应的配置文件。

    当我们使用了@EnableConfigurationProperties,且又在类总使用了@Component,就会报错,如下

     这个错误是,找到两个bean,一个类对应着两个bean导致不唯一了。

    原因是:@EnableConfigurationProperties(ServerConfig.class),默认会 交给spring容器去管理,而要想让spring去管理,首先得是一个bean对象,所就会把这个ServerConfig.class变成bean对象。我们在那个类中写了@Component,这个注解也是说这个是一个bean对象,这样就导致了同一个类中对应了两个bean对象,所以产生错误。这两个注解不能同时使用,一般使用@EnableConfigurationProperties更能体现出是哪个类受spring管且需要配置注入。

    解除@ConfigurationProperties注解警告 

    原因:springboot配置的处理器并没有配置,现在不能识别这个注解

    解决:那就给它加上

    pom.xml加上:

    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-configuration-processorartifactId>
    4. dependency>

    这样警告就没有了。

    @ConfigurationProperties可以为第三方的bean绑定属性。

    @ConfigurationProperties的松散绑定

    也叫宽松绑定,指的是在配置文件中的参数名任意大小写下划线或者中线,都会给你匹配出来。

     在实体类中也可以识别并正常运行。

    @Value不支持宽松绑定

     @ConfigurationProperties绑定前缀命名规范(prefix):仅能使用纯小写字母、数字、下划线作为合法的字符(以后都使用小写更方便。)

    小结:

    @ConfigurationProperties绑定属性支持属性名宽松绑定

    @Value注解不支持宽松绑定

    绑定的前缀命名有规则

  • 相关阅读:
    docker重启iptables策略失效
    在vue中点击右键出现自定义操作菜单
    GTC大咖论坛:数字孪生工厂为啥势在必行
    Redis:详解5大数据类型及其常用命令
    零零信安-D&D数据泄露报警日报【第40期】
    element-plus组件问题汇总
    单线复用iptv影响网速吗?
    阿里云ESSD云盘最大和最小IOPS说明
    asp.net基于net的冰淇淋订单管理系统-计算机毕业设计
    ESP32智能手表项目总目录
  • 原文地址:https://blog.csdn.net/weixin_60719453/article/details/127298035