• SpringBoot中的application.properties等一系列的配置文件


    Properties,Yaml】配置文件加载读取配置,配置外放

    应用场景

    在具体项目工程中,避免不了会有一些需要手动配置的配置项目,例如端口号,数据源信息或者静态资源路径,往往在这些手动配置项目中,原始状态下是通过硬编码的方式写在代码里面的,但是随意服务化概念以及Spring思想贯穿项目首尾的时候,很多必要手动配置都会采用外放的方式,放在项目的外部。

    例如数据源信息,不同的项目环境,可能采用的数据源信息不同,不因为每次打包都把环境信息修改,因此这些手动配置,通常应用到外部比较合适。

    配置文件格式

    配置文件的方式有很多,例如yaml格式、properties格式或者ini等等,一般SpringBoot乃至SpringCloud,它常用的文件格式无非就是yml,properties,xml或者ini这些我们常见的。关于项目的启动配置文件,通常就是前两种。

    • yml与properties的区别在于格式,yml相对于properties来说,格式的层级比较明显,但是书写格式也做了明确的要求,有的时候一个空格的误差都会导致项目启动产生问题
    • ini 文件是比较古老的文件格式,在Java中它的读取方式只能通过ini4j这一类工具去读取,它加载方式无法就是封装一层dom对象技术,因此读取效率是比较低的
    • xml文件,这是Spring常见配置文件,IoC和DI在久远的年代,都是通过xml的读取方式来生成项目所需的依赖对象,在启动的时候注入到Spring的容器中,目前对于logback配置依旧采用这种方式去管理项目的日志文件
    • settings文件,hutool工具中对这个配置文件情有独钟,它主要采用ini文件那种格式,同时读写比较快速,而且api接口也比较方便快捷

    关键配置文件格式,在【后轮子时代】,我们这些都是大树地下乘凉,前人帮我们需要干的事情都基本干好了。

    Properties与Yaml文件的区别

    • .properties 和 .yml 是 SpringBoot 中配置文件中的两种不同的后缀名。
    • 在 properties 文件中是以"."进行分割的;在 .yml 中是用“:”进行分割。
    • .yml 拥有天然的树状结构, .yml 的数据格式是 K-V 格式(和 json 很像),并且通过“:”进行赋值。
    • 在 .yml 中缩进一定不能使用 TAB,否则会报很奇怪的错误。
      冒号之后如果有值,那么冒号和值之间至少有一个空格,不能紧贴着。
    • .yml 比 .properties 对中文支持更友好。
    • yaml配置是有序的,properties配置是无序的
    # application.properties 配置端口
    server.port=443
    
    # application.yml 配置端口
    server:
    	port: 443
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    SpringBoot中加载配置文件

    在这里插入图片描述
    在SpringBoot项目启动中,配置文件加载文件存在先后顺序的,并且不同的文件格式,加载要是存在先后顺序的。例如:在yml或者properties中加载相同的配置,启动的时候可以打印一下就知道谁的优先级别高了。

    bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml

    • bootstrap.properties 是优先级最高
    • 先加载的配置会被后加载的配置给覆盖掉
    • Properties 文件优先级高于 YAML 文件

    在这里插入图片描述

    Profile配置多环境运行配置文件

    其实在一般企业开发,多半我们遇见的都是多环境部署方式,这就存在不同的环境端口,数据库等一些配置存在不同,但是我们又不想频繁的去更改配置文件,这就使用到了profile这个配置属性
    启动spring.profile.active的方式有很多种
    配置方式

    配置文件配置项读取

    • 通过 @Value(“${xxx.xxx.xxx}”) ,通过注解方式读取
    @Value("${service.root.url}")
    private String url;
    
    • 1
    • 2
    • 通过bean注入的方式读取配置,当然上面的第一种方式也是一种注入方式,只是它更简洁.@PropertySource(value=“classpath:xxx.properties”)
      案例(邮件配置为例):
      mail.properties
    #服务器 (若想使用QQ邮箱,请参考第六步)
    mailHost=smtp.163.com
    #端口号
    mailPort=25
    #邮箱账号(改成自己的,此为发送邮件方的账号,注意得是163账号)
    mailUsername=xxxxxxxxr@163.com
    #邮箱密码(改成自己的)我用的163.这里填163邮箱开启pop3/SMTP授权码
    mailPassword=xxxxxxxx
    #时间延迟
    mailTimeout=25000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    MailConfig.java

    package com.personloger.config;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;
    
    @PropertySource(value="classpath:mail.properties")
    @Configuration
    public class MailConfig {
        public static final String PROPERTIES_DEFAULT = "mail.properties";
        public static String host;
        public static Integer port;
        public static String userName;
        public static String passWord;
        public static String emailForm;
        public static String timeout;
        public static String personal;
        public static Properties properties;
    
        static {
            init();
        }
    
        private static void init(){
            properties = new Properties();
            try {
                //获取配置文件内容
                InputStream inputStream = MailConfig.class.getClassLoader().getResourceAsStream(PROPERTIES_DEFAULT);
                properties.load(inputStream);
                inputStream.close();
                //给属性赋值
                host = properties.getProperty("mailHost");
                port = Integer.parseInt(properties.getProperty("mailPort"));
                userName = properties.getProperty("mailUsername");
                passWord = properties.getProperty("mailPassword");
                emailForm = properties.getProperty("mailUsername");
                timeout = properties.getProperty("mailTimeout");
                //发送人
                personal = "Personloger Team";
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }
    
    • 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

    MailUtils.java

    package com.personloger.utils;
    import com.personloger.config.MailConfig;
    import org.springframework.mail.javamail.JavaMailSenderImpl;
    import org.springframework.mail.javamail.MimeMessageHelper;
    
    import javax.mail.MessagingException;
    import javax.mail.internet.MimeMessage;
    import java.io.UnsupportedEncodingException;
    import java.util.Properties;
    
    public class MailUtils {
        private static final String HOST = MailConfig.host;
        private static final Integer PORT = MailConfig.port;
        private static final String USERNAME = MailConfig.userName;
        private static final String PASSWORD = MailConfig.passWord;
        private static final String EMAILFROM = MailConfig.emailForm;
        private static final String TIMEOUT = MailConfig.timeout;
        private static final String PERSONAL = MailConfig.personal;
        private static JavaMailSenderImpl mailSender = createMailsender();
    
        /**
         * 配置好的工具
         * @return
         */
        private static JavaMailSenderImpl createMailsender(){
            JavaMailSenderImpl sender = new JavaMailSenderImpl();
            sender.setHost(HOST);
            sender.setPort(PORT);
            sender.setUsername(USERNAME);
            sender.setPassword(PASSWORD);
            sender.setDefaultEncoding("UTF-8");
            Properties p = new Properties();
            p.setProperty("mail.smtp.timeout", TIMEOUT);
            p.setProperty("mail.smtp.auth", "false");
            sender.setJavaMailProperties(p);
            return sender;
        }
    
        /**
         * 发送邮件
         * @param to 接收人
         * @param subject 主题
         * @param html 发送内容
         * @throws MessagingException
         * @throws UnsupportedEncodingException
         */
        public static void sendMail(String to, String subject, String html)
                throws MessagingException,UnsupportedEncodingException {
    
            MimeMessage mimeMessage = mailSender.createMimeMessage();
            //设置编码
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
            mimeMessageHelper.setFrom(EMAILFROM,PERSONAL);
            mimeMessageHelper.setTo(to);
            mimeMessageHelper.setSubject(subject);
            mimeMessageHelper.setText(html,true);
            mailSender.send(mimeMessage);
    
        }
    }
    
    • 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

    【自动注入方式】
    Spring还很贴心给我们提供一个实现接口,帮助我们自动去实例化。
    以上面MailUtils为例,只需要实现 InitializingBean 这个接口,重写
    afterPropertiesSet() 方法后,就是组件实例化,再通过注入方式,@Service等注解的方式注入到容器中,即可使用。

  • 相关阅读:
    总结前端高并发优化方案
    ES中SQL查询详解
    2023年高教社杯数学建模国赛 赛题浅析
    lua调用C++函数
    linux内核中修改TCP MSS值
    PyTorch深度学习
    车牌号识别易语言代码
    C++协程
    mac: nvm is already installed in /Users/**/.nvm, trying to update using git
    MobPush丨Android端SDK API
  • 原文地址:https://blog.csdn.net/weixin_44922964/article/details/126223795