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

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;
  • 通过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

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();
        }
    }

}

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);

    }
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的钱包空指针了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值