【SpringBoot】Bean属性绑定

简介: SpringBoot自定义Bean属性绑定、第三方Bean属性绑定、松散绑定、Bean的属性校验

1.自定义Bean属性绑定

  • 在配置文件application.yml 中配置参数
servers:        
  ipAddress: 192.168.0.1
  port: 2345
  timeout: -1

(注:不要写成server 这个是默认属性给tomcat服务器配置参数的)

  • 创建实体类(Bean)

    其中实体类的属性对应配置文件中配置的参数,相当于读取 配置文件 中的内容

@Data
//lombok自动生成get set方法
@Component
//使spring容器能够扫描到此类并注入到bean中
@ConfigurationProperties(prefix = "servers")
//加载配置文件中的属性 前缀为services 内容会自动按照属性名对应

public class ServerConfig {
   private String ipAddress;
   private int port;
   private long timeout;


}

注:@Data 使用lombok插件 自动生成get / set 方法,记得现在pom.xml中导入Lombok的坐标。

@Component Spring中的注解,使spring容器能够扫描到此类 自动封装为Bean 交与容器管理

@ConfigurationProperties(prefix = "servers") 加载配置文件中的属性 前缀为services 内容会自动按照属性名对应进行读取

  • 获取自定义的Bean
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        //获取容器对象
        ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);
        //通过类名获取Bean
        ServerConfig bean = run.getBean(ServerConfig.class);
        System.out.println(bean);


    }

}

springboot启动类中 ConfigurableApplicationContext 是获取spring容器对象 ,然后通过容器对象获取其中的ServerConfig类对应的Bean ,就是我们自定义的Bean

输出结果:
在这里插入图片描述

2.第三方bean属性绑定

以 数据源druid 为例

  • 在pom.xml中导入第三方库坐标
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.9</version>
</dependency>
  • 在配置类中创建Bean

可以在任意的配置类中 加载 数据源druid 的Bean,配置类就是可以被spring容器描扫到的类,一种简单的实现方式自己创建一个类加上@Component注解就可以当作一个配置类,比如之前的ServerConfig类。

SpringBoot的启动类 @SpringBootApplication 注解 中包含很多注解其中就有@Component 因此可以在启动类中配置Bean

@SpringBootApplication
public class Demo05Application {

    //通过 @Bean 创建Bean
    @Bean
    public DruidDataSource dataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        return  dataSource;
    }
    
    public static void main(String[] args) {
        //获取容器对象
        ConfigurableApplicationContext run = SpringApplication.run(Demo05Application.class, args);

        DruidDataSource dataSource = run.getBean(DruidDataSource.class);
        System.out.println(dataSource);

    }

}
  • 输出结果:

在这里插入图片描述

输出一堆参数,且参数值均没有初始化,这是由于Druid是懒加载,只有连接数据库时才会初始化

如何给第三方Bean注入数据

通过创建Bean的时候直接给某属性赋值 或者配置文件 读入

  • 直接赋值
@Bean
public DruidDataSource dataSource(){
    DruidDataSource dataSource = new DruidDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Driver456");
    return  dataSource;
}
  • 配置文件读入
datasource:
  driverClassName: com.mysql.jdbc.Driver456

@ConfigurationProperties(prefix = "datasource") 注解读入配置文件数据

@Bean
@ConfigurationProperties(prefix = "datasource")
public DruidDataSource dataSource(){
    DruidDataSource dataSource = new DruidDataSource();
    
    return  dataSource;
}

输出结果:在这里插入图片描述

前面我们一直说配置类,配置类是什么?

配置类就是可以被spring容器加载的类,一种简单的实现方式是 自己创建一个类加上@Component注解就可以当作一个配置类。

  • 缺点: 如果我们有几十个类,哪些类是配置类哪些类不是呢?我们总不能一个个去看有没有@Component注解,这样看起来很混乱

我们使用另一个注解 @EnableConfigurationProperties({类名...}) 参数为一个数组,数组中的元素就是 配置类的类名。 比如:@EnableConfigurationProperties(ServerConfig.class) (只有一个元素{}可省略)
在这里插入图片描述

此时同样可以获取 Bean 及 Bean所绑定的属性值

注:如果使用@EnableConfigurationProperties() 注解,那么@Component 就要去除,否则会报 NoUniqueBeanDefinitionException 每个Bean都是独一无二的,两个注解造成Bean冲突了

3.松散绑定

3.1属性绑定模式

@ConfigurationProperties注解绑定属性支持属性名松散绑定

以ServerConfig类为例

@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
   private String ipAddress;
   private int port;
   private long timeout;

}

支持的属性绑定模式:

  • 驼峰模式
servers:
  ipAddress: 192.168.0.1
  port: 2345
  timeout: -1
  • 下划线模式
servers:
  ip_address: 192.168.0.1
  port: 2345
  timeout: -1
  • 中划线模式
servers:
  ip-address: 192.168.0.1
  port: 2345
  timeout: -1
  • 常量模式
servers:
  IP_ADDRESS: 192.168.0.1
  port: 2345
  timeout: -1
  • 任意模式
servers:
  IP_ADD_R-E_SS: 192.168.0.1
  port: 2345
  timeout: -1

总结:@ConfigurationProperties注解支持属性松散绑定,属性名大小写忽略、下划线 _中划线 - 忽略。

注: 支持松散绑定的是@ConfigurationProperties注解,其他注解比如@Value就不支持,而springboot官方建议使用前者

3.2绑定前缀名命名规范

@ConfigurationProperties注解中的参数也就是prefix前缀名的命名规范:

仅能使用纯小写字母、数字、下划线作为合法的字符

比如这样写就不合法

@ConfigurationProperties(prefix = "Servers")

控制台报错信息


Configuration property name 'Servers' is not valid:

Invalid characters: 'S'
Bean: Servers-com.xue.config.ServerConfig
Reason: Canonical names should be kebab-case ('-' separated), lowercase alpha-numeric characters and must start with a letter

注:并非是我们配置文件属性名是servers,而这边前缀名是Servers 大小写不匹配的问题,即使配置文件属性名改为Servers,依旧会报相同的错误,这是由于绑定前缀名命名规范的问题。

事实上,在修改 绑定前缀名命名 为 Servers 时,编译器就会报错
在这里插入图片描述

4.Bean的属性校验

Bean的属性一般都有自己的格式或者类型,比如 端口 port 是数字并且要在规定范围内 ,如果我们写成字符就不行了,不是说不能用port属性,而是port属性作为tomcat服务器端口号注入的时候会报错。所以我们需要属性校验

  • 在pom.xml中导入JSR303规范接口坐标,并导入 hibernate框架提供的校验器做实现类
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
</dependency>
   <!--         使用hibernate框架提供的校验器做实现类-->
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
        </dependency>

注:这些依赖都没有写版本号,这是由于spring-boot-starter-parent 总的坐标默认有版本控制,这些依赖都有对应整合好的版本号

  • 对需要进行属性校验的Bean添加 @Validated 注解 开启属性校验
@Data
@ConfigurationProperties(prefix = "servers")
//加载配置文件中的属性 前缀为services 内容会自动按照属性名对应
@Validated
//开启对当前bean的属性注入校验
public class ServerConfig {
   private String ipAddress;
   private int port;
   private long timeout;

}
  • 设置具体的规则
@Data
@ConfigurationProperties(prefix = "servers")
//加载配置文件中的属性 前缀为services 内容会自动按照属性名对应
@Validated
//开启对当前bean的属性注入校验
public class ServerConfig {
   @Max(value = 8888,message = "最大值不能超过8888")
   @Min(value = 202,message = "最小值不能低于202")
   private String ipAddress;
   private int port;
   private long timeout;

}

输出结果:
输出结果

相关文章
|
16天前
|
Java
SpringBoot构建Bean(RedisConfig + RestTemplateConfig)
SpringBoot构建Bean(RedisConfig + RestTemplateConfig)
37 2
|
1月前
|
druid Java Maven
|
1月前
|
架构师 Java 开发者
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
在40岁老架构师尼恩的读者交流群中,近期多位读者成功获得了知名互联网企业的面试机会,如得物、阿里、滴滴等。然而,面对“Spring Boot自动装配机制”等核心面试题,部分读者因准备不足而未能顺利通过。为此,尼恩团队将系统化梳理和总结这一主题,帮助大家全面提升技术水平,让面试官“爱到不能自已”。
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
|
1月前
|
Java Spring 容器
Springboot3.2.1搞定了类Service和bean注解同名同类型问题修复
这篇文章讨论了在Spring Boot 3.2.1版本中,同名同类型的bean和@Service注解类之间冲突的问题得到了解决,之前版本中同名bean会相互覆盖,但不会在启动时报错,而在配置文件中设置`spring.main.allow-bean-definition-overriding=true`可以解决这个问题。
87 0
Springboot3.2.1搞定了类Service和bean注解同名同类型问题修复
|
2月前
|
Java Spring
springboot 集成 swagger 2.x 和 3.0 以及 Failed to start bean ‘documentationPluginsBootstrapper‘问题的解决
本文介绍了如何在Spring Boot项目中集成Swagger 2.x和3.0版本,并提供了解决Swagger在Spring Boot中启动失败问题“Failed to start bean ‘documentationPluginsBootstrapper’; nested exception is java.lang.NullPointerEx”的方法,包括配置yml文件和Spring Boot版本的降级。
springboot 集成 swagger 2.x 和 3.0 以及 Failed to start bean ‘documentationPluginsBootstrapper‘问题的解决
|
1月前
|
Java 应用服务中间件 Maven
SpringBoot Maven 项目打包的艺术--主清单属性缺失与NoClassDefFoundError的优雅解决方案
SpringBoot Maven 项目打包的艺术--主清单属性缺失与NoClassDefFoundError的优雅解决方案
329 0
|
1月前
|
Java Shell C++
Springboot加载注入bean的方式
本文详细介绍了Spring Boot中Bean的装配方法。首先讲解了使用@Component、@Service、@Controller、@Repository等注解声明Bean的方式,并解释了这些注解之间的关系及各自适用的层次。接着介绍了通过@Configuration和@Bean注解定义Bean的方法,展示了其灵活性和定制能力。最后讨论了@Component与@Bean的区别,并提供了在Spring Boot应用中装配依赖包中Bean的三种方法:使用@ComponentScan注解扫描指定包、使用@Import注解导入特定Bean以及在spring.factories文件中配置Bean。
|
3月前
|
缓存 Java 数据库连接
Spring Boot 资源文件属性配置,紧跟技术热点,为你的应用注入灵动活力!
【8月更文挑战第29天】在Spring Boot开发中,资源文件属性配置至关重要,它让开发者能灵活定制应用行为而不改动代码,极大提升了可维护性和扩展性。Spring Boot支持多种配置文件类型,如`application.properties`和`application.yml`,分别位于项目的resources目录下。`.properties`文件采用键值对形式,而`yml`文件则具有更清晰的层次结构,适合复杂配置。此外,Spring Boot还支持占位符引用和其他外部来源的属性值,便于不同环境下覆盖默认配置。通过合理配置,应用能快速适应各种环境与需求变化。
45 0
|
3月前
|
Java Spring 容器
Java SpringBoot 中,动态执行 bean 对象中的方法
Java SpringBoot 中,动态执行 bean 对象中的方法
40 0
|
3月前
|
Java Spring
Java SpringBoot Bean InitializingBean 项目初始化
Java SpringBoot Bean InitializingBean 项目初始化
55 0