• 目标:
  • 一、@ConfigurationProperties注解配置自定义Bean
  • 二、@ConfigurationProperties注解&@EnableConfigurationProperties配合使用配置自定义Bean
  • 三、@ConfigurationProperties注解配置第三方Bean
  • 四、@ConfigurationProperties注解宽松绑定
  • 五、pom.xml文件完整内容


一、@ConfigurationProperties注解配置自定义Bean

  • 0、基础依赖


         
         
<!--configuration-processor-->
< dependency >
< groupId >org.springframework.boot </ groupId >
< artifactId >spring-boot-configuration-processor </ artifactId >
< optional >true </ optional >
</ dependency >
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 1、自定义实体类,@Component注解注册Bean


         
         
@Component
@Data
@ConfigurationProperties( prefix = "servers")
public class ServerConfig {
private String ipAddress;
private int port;
private long timeout;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 2、application.yml配置属性


         
         
servers:
ipAddress: 192.168.0.1
port: 8889
timeout: -1
  • 1.
  • 2.
  • 3.
  • 4.
  • 3、从IOC容器中获取Bean


         
         
ServerConfig bean = applicationContext. getBean( ServerConfig. class);
  • 1.


二、@ConfigurationProperties注解&@EnableConfigurationProperties配合使用配置自定义Bean

  • 1、自定义实体类
    此处注意不要使用@Component将Bean注入容器,因为@EnableConfigurationProperties会有同样的作用。


         
         
//@Component
@Data
@ConfigurationProperties( prefix = "servers")
public class ServerConfig {
private String ipAddress;
private int port;
private long timeout;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 2、application.yml配置属性


         
         
servers:
ipAddress: 192.168.0.1
port: 8889
timeout: -1
  • 1.
  • 2.
  • 3.
  • 4.
  • 3、在启动类上使用@EnableConfigurationProperties
    如果有多个自定义Bean,使用数组形式配置即可,用","隔开。


         
         
@EnableConfigurationProperties({ ServletConfig .class})
  • 1.
  • 4、从IOC容器中获取Bean


         
         
ServerConfig bean = applicationContext. getBean( ServerConfig. class);
  • 1.

@EnableConfigurationProperties注册Bean的原理
① 跟踪源码可以看到@Import({EnableConfigurationPropertiesRegistrar.class})


         
         
@Target({ ElementType. TYPE})
@Retention( RetentionPolicy. RUNTIME)
@Documented
@Import({ EnableConfigurationPropertiesRegistrar. class})
public @interface EnableConfigurationProperties {
String VALIDATOR_BEAN_NAME = "configurationPropertiesValidator";

Class <?>[] value() default {};
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

②EnableConfigurationPropertiesRegistrar#registerBeanDefinitions会完成Bean的注册


         
         
@Override
public void registerBeanDefinitions( AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
registerInfrastructureBeans( registry);
registerMethodValidationExcludeFilter( registry);
ConfigurationPropertiesBeanRegistrar beanRegistrar = new ConfigurationPropertiesBeanRegistrar( registry);
getTypes( metadata). forEach( beanRegistrar::register);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.


三、@ConfigurationProperties注解配置第三方Bean

  • 1、@Bean注解注册Bean


         
         
@Bean
@ConfigurationProperties( prefix = "datasource") //Canonical names should be kebab-case ('-' separated)
public DruidDataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
return dataSource;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 2、application.yml配置属性


         
         
datasource:
driverClassName: com .mysql .jdbc .Driver
  • 1.
  • 2.
  • 3、从IOC容器中获取Bean


         
         
DruidDataSource dataSource = applicationContext. getBean( DruidDataSource. class);
  • 1.


四、@ConfigurationProperties注解宽松绑定

  • 1、@ConfigurationProperties注解属性绑定
    驼峰模式ipAddress
    下划线模式ip_address
    中划线模式ip-address
    常量模式IP_ADDRESS


         
         
servers:
ipAddress: 192.168.0.1
ipaddress: 192.168.0.2
ip_address: 192.168.0.3
ip-address: 192.168.0.4 #中划线模式(官方推荐)
IP_ADDRESS: 192.168.0.5
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 2、官方推荐
    官方推荐的模式是:中划线模式(烤肉串模式)


         
         
Canonical names should be kebab - case ( '-' separated)
  • 1.
  • 3、@Value注解
    不同于@ConfigurationProperties注解,@Value注解不支持宽松绑定。


         
         
@Value( "${servers.ipAddress}")
  • 1.
  • 4、@ConfigurationProperties注解前缀命名
    prefix 命名规范只能使用:小写字母、数字、下划线作为合法字符,另外"-"能被识别忽略。

【Spring Boot-@ConfigurationProperties注解的使用】_自定义

五、pom.xml文件完整内容


         
         
<?xml version="1.0" encoding="UTF-8"?>
< project xmlns= "http://maven.apache.org/POM/4.0.0" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" >
< modelVersion >4.0.0 </ modelVersion >

< parent >
< groupId >org.springframework.boot </ groupId >
< artifactId >spring-boot-starter-parent </ artifactId >
< version >2.6.4 </ version >
< relativePath /> <!-- lookup parent from repository -->
</ parent >

< groupId >com.stone </ groupId >
< artifactId >springboot_13_configuration </ artifactId >
< version >0.0.1-SNAPSHOT </ version >

< dependencies >
<!--base-->
< dependency >
< groupId >org.springframework.boot </ groupId >
< artifactId >spring-boot-starter </ artifactId >
</ dependency >
<!--test-->
< dependency >
< groupId >org.springframework.boot </ groupId >
< artifactId >spring-boot-starter-test </ artifactId >
< scope >test </ scope >
</ dependency >
<!--druid work with jdbc-->
< dependency >
< groupId >com.alibaba </ groupId >
< artifactId >druid-spring-boot-starter </ artifactId >
< version >1.2.6 </ version >
</ dependency >
<!--jdbc-->
< dependency >
< groupId >org.springframework.boot </ groupId >
< artifactId >spring-boot-starter-jdbc </ artifactId >
</ dependency >
<!--lombok-->
< dependency >
< groupId >org.projectlombok </ groupId >
< artifactId >lombok </ artifactId >
</ dependency >
<!--configuration-processor-->
< dependency >
< groupId >org.springframework.boot </ groupId >
< artifactId >spring-boot-configuration-processor </ artifactId >
< optional >true </ optional >
</ dependency >
</ dependencies >

< build >
< plugins >
< plugin >
< groupId >org.springframework.boot </ groupId >
< artifactId >spring-boot-maven-plugin </ artifactId >
</ plugin >
</ plugins >
</ build >

</ project >
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.

六、结尾

以上即为本文全部内容