栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

文章目录
  • 【Properties,Yaml】配置文件加载读取配置,配置外放
    • 应用场景
    • 配置文件格式
    • Properties与Yaml文件的区别
    • SpringBoot中加载配置文件
    • Profile配置多环境运行配置文件
    • 配置文件配置项读取

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

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

    
    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等注解的方式注入到容器中,即可使用。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1040924.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号