首页 > 技术文章 > SpringBoot——属性注入

wqff-biubiu 2020-03-25 13:49 原文

SpringBoot——启动与自动配置类查找中通过@EnableAutoConfiguration找到了自动配置类,然后通过自动配置类中的@Bean等注解,创建一个一个的Bean实例到IOC容器中,

但还有一个问题没有弄清楚:属性注入,这些Bean的默认属性是在什么时候放入进去的。写了一堆东西然后发现

错误的认识了spring-configuration-metadata.json以及additional-spring-configuration-metadata.json文件的作用。这两个文件是application配置的提示文件。

并不参与Bean的默认属性注入。

Bean的默认属性是在Java文件中或者注解中默认。例如:

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ Servlet.class, StandardServletMultipartResolver.class, MultipartConfigElement.class })
//如果spring.servlet.multipart.enabled未设置,默认为true ,matchIfMissing = true
@ConditionalOnProperty(prefix = "spring.servlet.multipart", name = "enabled", matchIfMissing = true)
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(MultipartProperties.class)
public class MultipartAutoConfiguration {

    //MultipartProperties的默认属性都在MultipartProperties.java中
    private final MultipartProperties multipartProperties;

    public MultipartAutoConfiguration(MultipartProperties multipartProperties) {
        this.multipartProperties = multipartProperties;
    }

    @Bean
    @ConditionalOnMissingBean({ MultipartConfigElement.class, CommonsMultipartResolver.class })
    public MultipartConfigElement multipartConfigElement() {
        return this.multipartProperties.createMultipartConfig();
    }

    @Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
    @ConditionalOnMissingBean(MultipartResolver.class)
    public StandardServletMultipartResolver multipartResolver() {
        StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
        multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());
        return multipartResolver;
    }

}

MultipartProperties.java

//这个注解作用是跟application.properties中的spring.servlet.mutipart绑定,设置了就会覆盖默认值
@ConfigurationProperties(prefix = "spring.servlet.multipart", ignoreUnknownFields = false)
public class MultipartProperties {
    //Java类中属性都是用默认值的
    private boolean enabled = true;
    private String location;
    private DataSize maxFileSize = DataSize.ofMegabytes(1);//默认1MB
    private DataSize maxRequestSize = DataSize.ofMegabytes(10);//默认10MB
    private DataSize fileSizeThreshold = DataSize.ofBytes(0);//默认0B
    private boolean resolveLazily = false;

}

    public static DataSize ofMegabytes(long megabytes) {
        //new DataSize(megabytes * 1024 * 1024 B)
        return new DataSize(Math.multiplyExact(megabytes, BYTES_PER_MB));
    }

    public static DataSize ofBytes(long bytes) {
        //new DataSize(bytes  B)
        return new DataSize(bytes);
    }

至于spring-configuration-metadata.json以及additional-spring-configuration-metadata.json文件:仅仅只是配置application.properties文件时的提示文件

   //。。。 跟默认配置相同,但仅仅是提示作用,不参与Bean初始化,下面是截取的multipart的默认提示
   {
      "name": "spring.servlet.multipart.enabled",
      "type": "java.lang.Boolean",
      "description": "Whether to enable support of multipart uploads.",
      "sourceType": "org.springframework.boot.autoconfigure.web.servlet.MultipartProperties",
      "defaultValue": true
    },
    {
      "name": "spring.servlet.multipart.file-size-threshold",
      "type": "org.springframework.util.unit.DataSize",
      "description": "Threshold after which files are written to disk.",
      "sourceType": "org.springframework.boot.autoconfigure.web.servlet.MultipartProperties",
      "defaultValue": "0B"
    },
    {
      "name": "spring.servlet.multipart.location",
      "type": "java.lang.String",
      "description": "Intermediate location of uploaded files.",
      "sourceType": "org.springframework.boot.autoconfigure.web.servlet.MultipartProperties"
    },
    {
      "name": "spring.servlet.multipart.max-file-size",
      "type": "org.springframework.util.unit.DataSize",
      "description": "Max file size.",
      "sourceType": "org.springframework.boot.autoconfigure.web.servlet.MultipartProperties",
      "defaultValue": "1MB"
    },
    {
      "name": "spring.servlet.multipart.max-request-size",
      "type": "org.springframework.util.unit.DataSize",
      "description": "Max request size.",
      "sourceType": "org.springframework.boot.autoconfigure.web.servlet.MultipartProperties",
      "defaultValue": "10MB"
    },
    {
      "name": "spring.servlet.multipart.resolve-lazily",
      "type": "java.lang.Boolean",
      "description": "Whether to resolve the multipart request lazily at the time of file or parameter access.",
      "sourceType": "org.springframework.boot.autoconfigure.web.servlet.MultipartProperties",
      "defaultValue": false
    },
     //。。。

...

 

推荐阅读