一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

SpringBoot自定义bean绑定解析

时间:2022-10-24 编辑:坚强 来源:一聚教程网

本文为小伙伴们带来了关于SpringBoot自定义bean绑定解析,感兴趣小伙伴一起来看看吧。

自定义bean绑定

在配置文件中写入

servers:
 ipAddress: 192.158.0.1
 port: 1234
 detail: zhangsan

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

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

启动类下的

import com.pojo.ServerConfig;
        import org.springframework.boot.SpringApplication;
        import org.springframework.boot.autoconfigure.SpringBootApplication;
        import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class Springboot11ConfigurationApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(Springboot11ConfigurationApplication.class, args);
        ServerConfig bean = run.getBean(ServerConfig.class);
        System.out.println(bean);
    }
}

导入第三方bean

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

导入druid坐标

      
            com.alibaba
            druid
            1.2.12
        

启动类

@SpringBootApplication
public class Springboot11ConfigurationApplication {
    @Bean//注入
    public DruidDataSource druidDataSource(){
        DruidDataSource ds=new DruidDataSource();
        return ds;
    }
    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(Springboot11ConfigurationApplication.class, args);
       ServerConfig bean = run.getBean(ServerConfig.class);
       System.out.println(bean);
        DruidDataSource dds = run.getBean(DruidDataSource.class);
        System.out.println(dds);
    }
}

运行出来什么也没

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

application.yml下

datasource:
 driverClassName: "com.mysql.jdbc.driver.zhkc"
 username: "张三"
 password: kczh

启动类下

package com;
import com.alibaba.druid.pool.DruidDataSource;
import com.pojo.ServerConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class Springboot11ConfigurationApplication {
    @Bean
    @ConfigurationProperties(prefix = "datasource")
    public DruidDataSource druidDataSource(){
        DruidDataSource ds=new DruidDataSource();
        return ds;
    }
    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(Springboot11ConfigurationApplication.class, args);
//        ServerConfig bean = run.getBean(ServerConfig.class);
//        System.out.println(bean);
        DruidDataSource dds = run.getBean(DruidDataSource.class);
        System.out.println(dds.getDriverClassName());
        System.out.println(dds.getUsername());
        System.out.println(dds.getPassword());
    }
}

运行结果

出现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加上:

     
            org.springframework.boot
            spring-boot-configuration-processor
        

这样警告就没有了。

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

@ConfigurationProperties的松散绑定

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

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

@Value不支持宽松绑定

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

小结:

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

@Value注解不支持宽松绑定

绑定的前缀命名有规则

热门栏目