当前位置 : 主页 > 编程语言 > java >

SpringBoot自定义bean绑定实现

来源:互联网 收集:自由互联 发布时间:2023-01-30
目录 自定义bean绑定 导入第三方bean 第三方bea通过配置文件注参数 出现Prefix must be in canonical form @EnableConfigurationProperties()和@ConfigurationProperties的区别 解除@ConfigurationProperties注解警告 @C
目录
  • 自定义bean绑定
  • 导入第三方bean
    • 第三方bea通过配置文件注参数
    • 出现Prefix must be in canonical form
    • @EnableConfigurationProperties()和@ConfigurationProperties的区别
    • 解除@ConfigurationProperties注解警告
  • @ConfigurationProperties的松散绑定

    自定义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坐标

          <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.2.12</version>
            </dependency>

    启动类

    @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加上:

         <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
            </dependency>

    这样警告就没有了。

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

    @ConfigurationProperties的松散绑定

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

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

    @Value不支持宽松绑定

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

    小结:

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

    @Value注解不支持宽松绑定

    绑定的前缀命名有规则

    到此这篇关于SpringBoot自定义bean绑定实现的文章就介绍到这了,更多相关SpringBoot bean绑定内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

    网友评论