在具体项目工程中,避免不了会有一些需要手动配置的配置项目,例如端口号,数据源信息或者静态资源路径,往往在这些手动配置项目中,原始状态下是通过硬编码的方式写在代码里面的,但是随意服务化概念以及Spring思想贯穿项目首尾的时候,很多必要手动配置都会采用外放的方式,放在项目的外部。
例如数据源信息,不同的项目环境,可能采用的数据源信息不同,不因为每次打包都把环境信息修改,因此这些手动配置,通常应用到外部比较合适。
配置文件的方式有很多,例如yaml格式、properties格式或者ini等等,一般SpringBoot乃至SpringCloud,它常用的文件格式无非就是yml,properties,xml或者ini这些我们常见的。关于项目的启动配置文件,通常就是前两种。
关键配置文件格式,在【后轮子时代】,我们这些都是大树地下乘凉,前人帮我们需要干的事情都基本干好了。
# application.properties 配置端口
server.port=443
# application.yml 配置端口
server:
port: 443
在SpringBoot项目启动中,配置文件加载文件存在先后顺序的,并且不同的文件格式,加载要是存在先后顺序的。例如:在yml或者properties中加载相同的配置,启动的时候可以打印一下就知道谁的优先级别高了。
bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml
其实在一般企业开发,多半我们遇见的都是多环境部署方式,这就存在不同的环境端口,数据库等一些配置存在不同,但是我们又不想频繁的去更改配置文件,这就使用到了profile这个配置属性
启动spring.profile.active的方式有很多种
配置方式
@Value("${service.root.url}")
private String url;
#服务器 (若想使用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等注解的方式注入到容器中,即可使用。