SpringBoot如何自定义bean绑定

2023-10-28,

本篇内容介绍了“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坐标

          <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绑定.doc》

    下载本文的Word格式文档,以方便收藏与打印。