• SpringBoot——属性注入


    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
        },
         //。。。

    ...

  • 相关阅读:
    【已解决】github中git push origin master出错:error: failed to push some refs to
    好记心不如烂笔头,ssh登录 The authenticity of host 192.168.0.xxx can't be established. 的问题
    THINKPHP 5.0目录结构
    thinkphp5.0入口文件
    thinkphp5.0 生命周期
    thinkphp5.0 架构
    Django template
    Django queryset
    Django model
    Python unittest
  • 原文地址:https://www.cnblogs.com/wqff-biubiu/p/12565810.html
Copyright © 2020-2023  润新知