zoukankan      html  css  js  c++  java
  • 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
        },
         //。。。

    ...

  • 相关阅读:
    适配器模式
    注册模式
    工厂模式
    策略模式和注入控制反转
    验签
    php中加密和解密
    asp.net textbox keyup事件触发后台的textchange事件
    jquery $.post 返回json数据
    网页播放音频、视频文件——基于web的html 5的音乐播放器(转载)
    c# 柱状图(转载)
  • 原文地址:https://www.cnblogs.com/wqff-biubiu/p/12565810.html
Copyright © 2011-2022 走看看