ConfigrationProperties

先看普通的@ConfigrationProperties的基本使用

这个注解表示它可以使用yaml注入属性值。

通常还需要指定它为一个@Component,将这个类纳入IoC容器的管理。自动扫描进IoC。

它的后面需要指定prefix值,这表明了对应yaml的前缀。

步骤:

  1. 在要放入IoC容器中的类上添加两个注解

    @Component    // 表示这个类会被放进IoC容器管理
    @ConfigurationProperties(prefix = "dog")  // 表示这个类可以使用yaml注入,它在yaml中的名字为dog
    public class Dog {
    
        @Value("旺财")   // 会被yaml注入值覆盖,若yaml中没有,则使用这个值
        private String name;
    
        @Value("3")  // 会被yaml中的注入值覆盖,若没有,则使用这个注入的值
        private Integer age;
    
        ....... // 构造函数,setter,getter,toString()
    
    }
  2. application.yaml

    dog: 
      name: 旺财233
  3. 测试

    @SpringBootTest
    class Springboot02ConfigApplicationTests {
    
        @Autowired  // autowired表示这个对象是从IoC容器提取出来的
        private Dog dog;
    
        @Test
        void contextLoads() {
            System.out.println(dog);
        }
    }
  4. 观察输出,可以看到,名字被yaml注入值覆盖了;年龄是采用@Value注入后的值(不是空值)

    Dog{name='旺财233', age=3}

EnableConfigurationProperties

在很多spring源码中,常见的注解,通常将它应用到spring的配置类下,

即,@EnableConfigurationProperties@Configuration(声明是一个配置类,管理很多Bean)会经常成对使用。

@EnableConfigurationProperties 可以让指定的类纳入IoC管理,成为一个Bean。而不需要使用@Component这个注解。

下面以Spring的某源码为例。

HttpEncodingAutoConfiguration

package org.springframework.boot.autoconfigure.web.servlet;

import .....

// 从Configuration 可以看出这个类是一个spring配置类。代替spring的xml配置文件,里面放着各种bean配置声明
@Configuration(proxyBeanMethods = false)
  
// 配置其中的属性
@EnableConfigurationProperties(ServerProperties.class)
  
// 判断条件,是否生效。
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {

    private final Encoding properties;

    public HttpEncodingAutoConfiguration(ServerProperties properties) {
        this.properties = properties.getServlet().getEncoding();
    }

    @Bean
    @ConditionalOnMissingBean
    public CharacterEncodingFilter characterEncodingFilter() {
        ......
    }
 
    .........
}

ServerProperties.java

ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {

   /**
    * Server HTTP port.
    */
   private Integer port;

   /**
    * Network address to which the server should bind.
    */
   private InetAddress address;
  
    ........

}
最后修改:2020 年 08 月 17 日
如果觉得我的文章对你有用,请随意赞赏