大家都知道springboot运行web程序都是直接打包成一个jar包然后直接java -jar <jar包路径>就可以跑起来了,但是如果我们需要修改jar包里面的配置文件呢?
1.在源码中修改完再打包一次,然后重新部署;
2.允许jar包运行时去读取jar包外部的配置文件,那么直接修改一下配置文件就重新启动一下就OK;
很明显,第二种方法是比较符合方便定理的;
那么怎么去读取呢?
1)完全没有框架,使用文件流来读取配置文件(springboot引用了一个底层的自己写的项目);
Properties dataSourceConfig = new Properties(); String absolutePath = new File("").getAbsolutePath(); //获取jar包当前的目录 String filePath = absolutePath + "/db.properties"; // filePath = filePath.replace("\\", "/");// 拼好文件路径 File file = new File(filePath); InputStream in; // 输入流 if (!file.exists()) { in = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"); } else { in = new FileInputStream(file); } dataSourceConfig.load(in);//properties文件转为Properties对象 in.close();//关闭输入流
获取到了Properties对象后就可以拿去读配置出来了!
2)使用spring框架
首先springboot默认会先去jar包同路径下寻找application.properties文件,如果找不到就会去resource下找application.properties文件,这是springboot默认的配置文件加载机制;
如果你需要修改application.properties的文件名,那么还有一种默认的加载机制;在application.properties文件中指定另外一个配置文件的后缀名
application.properties文件中配置这么一句:
spring.profiles.active: xx
那么springboot还会按先外再内的规则去加载application-xx.properties文件;
或者直接使用其他名称配置:spring.config.name=xx
有或者指定一个目录:spring.config.location=/a/b
springboot加载配置文件的优先级:
1.加载jar包目录下的/config文件夹
2.加载jar包目录下的配置文件
3.加载resource文件夹下的config文件夹
4.加载resource目录下的
当需要自定义配置文件的名称时:
1.建一个配置类,然后通过注解@PropertySource来注入
@Component @ConfigurationProperties(prefix = DataSourceProperties.PREFIX) //指定前缀 @PropertySource(value = {DataSourceProperties.configPath + "datasource-application.properties"}) public class DataSourceProperties implements BeanClassLoaderAware{ public static final String PREFIX = "spring.datasource"; public final static String configPath = "classpath:"; private ClassLoader classLoader; private String scanLocation; private Integer maxActive; private Integer initialSize; private Integer maxWait @Override public void setBeanClassLoader(ClassLoader classLoader) { this.classLoader = classLoader; } ............. }
2.在启动类中加载配置文件
@Configuration
@ComponentScan("com.liangliang")
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class) // 排除springboot内部的配置
//@EnableTransactionManagement
public class ApplicationServer {
public static void main(String[] args) throws IOException {
Properties configInfo = new Properties();
InputStream in = ApplicationServer.class.getClassLoader().getResourceAsStream("xx.properties");
configInfo.load(in);
SpringApplication app = new SpringApplication(ApplicationServer.class);
app.setDefaultProperties(configInfo);
app.run(args);
}
}
注意:springboot默认回去加载spring.datasource开头的数据库连接信息,如果你不需要需要在启动类中使用@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)排除该属性的加载;