Spring运维之boot项目bean属性的绑定读取与校验

简介: Spring运维之boot项目bean属性的绑定读取与校验

第三方bean属性的绑定

先写一个实体类

我们在配置yml文件里写了属性值 能一一对应

我们用注解让其对应

我们在启动类里面测试

我们首先拿到容器对象

再拿到bean 打印bean 发现我们的容器获取到的bean bean的属性与配置里面的属性一一对应

这时候提出一个问题

这是我们自定义的bean

假如我们的bean不是自定义的 而是第三方bean加载的我们该如何去操作呢

我们引入druid的依赖

重新书写

实际效果

我们现在有数据

我们要将其注入到第三方对象datasource上

我们该如何注入呢

我们同样可以用这个注解注入配置

小结

有的注解前面有一个unable

启动起来会报错

不唯一的bean定义

原因是之前那个Component主机又定义其为一个bean

这样就有冲突

我们要做的就是把之前那个定义给注释掉

总结总结

提示 processer 未进行配置

松散绑定

对于我们使用注解的时候

绑定属性的时候 我们对名称的要求其实是非常低的

照样能读取出来

这些都可以

我们发现定义在yml里面格式匹配

是随便写

我们的主流书写模式是这样的

规范的模式使用

写在测试类里面

junit

控制台展示出来了结果

注意事项

boot主要推荐我们用@ConfigurationProperties绑定属性支持属性名的松散绑定

prefix 里面的属性名全是小写和中划线

常用计量单位的应用

这里有具体的数据逻辑

但是如果数值过大

100000000000000000000就不便于读取

也不知道单位

在jdk8之后 出现了很多与时间相关的属性

定义时间

package com.example.demo.config;
 
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
 
import java.time.Duration;
 
//装配为spring的bean
@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
    private String ipAddress;
    private int port;
    private long timeout;
 
    // 服务器超时时间
    private Duration serverTimeOut;
}package com.example.demo.config;
 
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
 
import java.time.Duration;
 
//装配为spring的bean
@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
    private String ipAddress;
    private int port;
    private long timeout;
 
    // 服务器超时时间
    private Duration serverTimeOut;
}package com.example.demo.config;
 
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
 
import java.time.Duration;
 
//装配为spring的bean
@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
    private String ipAddress;
    private int port;
    private long timeout;
 
    // 服务器超时时间
    private Duration serverTimeOut;
}

这边输出就是秒

用注解自定义时间的格式类型

SpringBoot支持JDK8提供的时间与空间计量的单位

package com.example.demo.config;
 
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.convert.DataSizeUnit;
import org.springframework.boot.convert.DurationUnit;
import org.springframework.stereotype.Component;
import org.springframework.util.unit.DataSize;
import org.springframework.util.unit.DataUnit;
 
import java.time.Duration;
import java.time.temporal.ChronoUnit;
 
//装配为spring的bean
@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
    private String ipAddress;
    private int port;
    private long timeout;
 
    @DurationUnit(ChronoUnit.HOURS)
    // 服务器超时时间
    private Duration serverTimeOut;
 
    @DataSizeUnit(DataUnit.MEGABYTES)
    // 文件存储的单位 MB
    private DataSize dataSize;
}

小结

计量单位

bean属性校验

当我们配置bean的时候

会有一个属性配置错误

配置错误也找不出来

如果我们有一个校验就好了

开启数据校验有助于系统的安全性

J2EE规范中的JSR303规范定义了一组有关数据校验相关的API

<dependency>
   <groupId>javax.validation</groupId>
   <artifactId>validation-api</artifactId>
   <version>2.0.1.Final</version>
</dependency>

在xml文件里引入坐标

这个东西相当于JDBC技术

JDBC是接口

不是实现类

实现类仅仅是Mysql的驱动

我们写了一堆接口 jdbc是一套规范

Mysql才是实现类

jdbc是一套规范

引入依赖后我们可以开启对当前bean的属性注入校验

校验注解

@Validated

但是我们还没有对指定的字段进行校验

用Validated提供的注解

增加校验规则

但是这样我们只是书写了接口

没有书写实现类

我们还要加一个Hibernate的校验器

我们首先要引入依赖

<dependency>
   <groupId>org.hibernate.validator</groupId>
   <artifactId>hibernate-validator</artifactId>
   <version>8.0.1.Final</version>
</dependency>

使用hibernate提供的校验器做实现类

<!--导入JSR303规范-->
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>
 
<!--使用hibernate框架提供的校验器做实现类-->
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>8.0.1.Final</version>
</dependency>

控制台就会打印信息

小结

进制数据转换的规则

注入配置文件

yaml的语法规则

以后我们在做程序的时候

输入的密码被识别成八进制数 转化为10进制

我们推荐的是 纯字符串就用字符串

""引号 包裹

目录
相关文章
|
15天前
|
缓存 Java Spring
实战指南:四种调整 Spring Bean 初始化顺序的方案
本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
实战指南:四种调整 Spring Bean 初始化顺序的方案
|
9天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
21 2
|
1月前
|
XML Java 数据格式
Spring从入门到入土(bean的一些子标签及注解的使用)
本文详细介绍了Spring框架中Bean的创建和使用,包括使用XML配置文件中的标签和注解来创建和管理Bean,以及如何通过构造器、Setter方法和属性注入来配置Bean。
70 9
Spring从入门到入土(bean的一些子标签及注解的使用)
|
1月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
55 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
1月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
1月前
|
Java 开发者 Spring
Spring bean的生命周期详解!
本文详细解析Spring Bean的生命周期及其核心概念,并深入源码分析。Spring Bean是Spring框架的核心,由容器管理其生命周期。从实例化到销毁,共经历十个阶段,包括属性赋值、接口回调、初始化及销毁等。通过剖析`BeanFactory`、`ApplicationContext`等关键接口与类,帮助你深入了解Spring Bean的管理机制。希望本文能助你更好地掌握Spring Bean生命周期。
83 1
|
1月前
|
Java Spring
获取spring工厂中bean对象的两种方式
获取spring工厂中bean对象的两种方式
40 1
|
1月前
|
Java 开发者 Spring
Spring bean的生命周期详解!
本文详细介绍了Spring框架中的核心概念——Spring Bean的生命周期,包括实例化、属性赋值、接口回调、初始化、使用及销毁等10个阶段,并深入剖析了相关源码,如`BeanFactory`、`DefaultListableBeanFactory`和`BeanPostProcessor`等关键类与接口。通过理解这些核心组件,读者可以更好地掌握Spring Bean的管理和控制机制。
87 1
|
6月前
|
XML 安全 Java
深入实践springboot实战 蓄势待发 我不是雷锋 我是知识搬运工
springboot,说白了就是一个集合了功能的大类库,包括springMVC,spring,spring data,spring security等等,并且提供了很多和可以和其他常用框架,插件完美整合的接口(只能说是一些常用框架,基本在github上能排上名次的都有完美整合,但如果是自己写的一个框架就无法实现快速整合)。
|
3月前
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
下一篇
无影云桌面