From 96cb2dcee45bcee125b922ccb36f28839f3b1f2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Sun, 18 Oct 2020 11:38:05 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=90=AF=E5=8A=A8=E6=97=B6=E9=A6=96?= =?UTF-8?q?=E9=80=89=E6=9C=AC=E5=9C=B0=E6=96=87=E4=BB=B6=E4=B8=AD=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E7=9A=84=E9=85=8D=E7=BD=AE=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/celess/blog/BlogApplication.java | 7 +- .../blog/configuration/DruidConfig.java | 74 +++++++++---- .../blog/configuration/DruidConfigTest.java | 103 ++++++++++++++++++ 3 files changed, 164 insertions(+), 20 deletions(-) create mode 100644 src/test/java/cn/celess/blog/configuration/DruidConfigTest.java diff --git a/src/main/java/cn/celess/blog/BlogApplication.java b/src/main/java/cn/celess/blog/BlogApplication.java index 9ad6477..d33d0cf 100644 --- a/src/main/java/cn/celess/blog/BlogApplication.java +++ b/src/main/java/cn/celess/blog/BlogApplication.java @@ -3,14 +3,19 @@ package cn.celess.blog; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; import org.springframework.scheduling.annotation.EnableAsync; +/** + * @author zheng + */ @SpringBootApplication @EnableAsync @MapperScan("cn.celess.blog.mapper") public class BlogApplication { + private static ApplicationContext context; public static void main(String[] args) { - SpringApplication.run(BlogApplication.class, args); + context = SpringApplication.run(BlogApplication.class, args); } } diff --git a/src/main/java/cn/celess/blog/configuration/DruidConfig.java b/src/main/java/cn/celess/blog/configuration/DruidConfig.java index 8bfcacc..d9113b1 100644 --- a/src/main/java/cn/celess/blog/configuration/DruidConfig.java +++ b/src/main/java/cn/celess/blog/configuration/DruidConfig.java @@ -1,41 +1,77 @@ package cn.celess.blog.configuration; import com.alibaba.druid.pool.DruidDataSource; -import org.springframework.beans.factory.annotation.Value; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Properties; /** * @author : xiaohai * @date : 2019/03/28 14:26 */ +@Slf4j @Configuration public class DruidConfig { - @Value("${spring.datasource.url}") - private String dbUrl; - @Value("${spring.datasource.username}") - private String username; + @Autowired + Environment env; - @Value("${spring.datasource.password}") - private String password; - - @Value("${spring.datasource.driver-class-name}") - private String driverClassName; + public static final String DB_CONFIG_PATH = System.getProperty("user.home") + "/blog/application.properties"; + public static final String DB_CONFIG_URL_PREFIX = "spring.datasource.url"; + public static final String DB_CONFIG_USERNAME_PREFIX = "spring.datasource.username"; + public static final String DB_CONFIG_PASSWORD_PREFIX = "spring.datasource.password"; + public static final String DB_CONFIG_DRIVER_CLASS_NAME_PREFIX = "spring.datasource.driver-class-name"; @Bean - public DruidDataSource druidDataSource() { - DruidDataSource dataSource = new DruidDataSource(); - dataSource.setDriverClassName(driverClassName); - // 数据库基本信息 - dataSource.setUrl(dbUrl); - dataSource.setUsername(username); - dataSource.setPassword(password); - - // 数据库连接池配置 + public DruidDataSource initDataSource() throws IOException { + DruidDataSource dataSource; + File file = new File(DB_CONFIG_PATH); + if (file.exists()) { + log.debug("从文件中获取数据库配置"); + dataSource = readConfigFromFile(file); + } else { + log.debug("默认数据库配置"); + dataSource = defaultDruidSource(); + } dataSource.setInitialSize(10); dataSource.setMinIdle(10); dataSource.setMaxActive(100); return dataSource; } + + private DruidDataSource readConfigFromFile(File file) throws IOException { + Properties properties = new Properties(); + properties.load(new FileInputStream(file)); + String url = properties.getProperty(DB_CONFIG_URL_PREFIX, null); + String username = properties.getProperty(DB_CONFIG_USERNAME_PREFIX, null); + String password = properties.getProperty(DB_CONFIG_PASSWORD_PREFIX, null); + String className = properties.getProperty(DB_CONFIG_DRIVER_CLASS_NAME_PREFIX, null); + if (url == null || username == null || password == null || className == null) { + return defaultDruidSource(); + } + DruidDataSource dataSource = new DruidDataSource(); + dataSource.setDriverClassName(className); + dataSource.setUrl(url); + dataSource.setUsername(username); + dataSource.setPassword(password); + return dataSource; + } + + + private DruidDataSource defaultDruidSource() { + DruidDataSource dataSource = new DruidDataSource(); + dataSource.setDriverClassName(env.getProperty(DruidConfig.DB_CONFIG_DRIVER_CLASS_NAME_PREFIX)); + dataSource.setUrl(env.getProperty(DruidConfig.DB_CONFIG_URL_PREFIX)); + dataSource.setUsername(env.getProperty(DruidConfig.DB_CONFIG_USERNAME_PREFIX)); + dataSource.setPassword(env.getProperty(DruidConfig.DB_CONFIG_PASSWORD_PREFIX)); + return dataSource; + } } diff --git a/src/test/java/cn/celess/blog/configuration/DruidConfigTest.java b/src/test/java/cn/celess/blog/configuration/DruidConfigTest.java new file mode 100644 index 0000000..7ce616c --- /dev/null +++ b/src/test/java/cn/celess/blog/configuration/DruidConfigTest.java @@ -0,0 +1,103 @@ +package cn.celess.blog.configuration; + +import cn.celess.blog.BaseTest; +import com.alibaba.druid.pool.DruidDataSource; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Properties; + +import static org.junit.Assert.*; + +public class DruidConfigTest extends BaseTest { + + @Autowired + Environment env; + + private File configFile; + private File bakConfigFile; + + @Test + public void initDataSource() throws IOException { + + DruidConfig druidConfig = new DruidConfig(); + druidConfig.env = env; + + // 无配置文件 + assertTrue(!configFile.exists() || configFile.delete()); + DruidDataSource druidDataSource = druidConfig.initDataSource(); + + // 加载初始化时候配置文件的数据库连接 + assertEquals(env.getProperty(DruidConfig.DB_CONFIG_URL_PREFIX), druidDataSource.getUrl()); + assertEquals(env.getProperty(DruidConfig.DB_CONFIG_DRIVER_CLASS_NAME_PREFIX), druidDataSource.getDriverClassName()); + assertEquals(env.getProperty(DruidConfig.DB_CONFIG_USERNAME_PREFIX), druidDataSource.getUsername()); + assertEquals(env.getProperty(DruidConfig.DB_CONFIG_PASSWORD_PREFIX), druidDataSource.getPassword()); + assertTrue(configFile.createNewFile()); + + // 有配置文件的测试 + Properties properties = new Properties(); + properties.load(new FileInputStream(configFile)); + properties.setProperty(DruidConfig.DB_CONFIG_URL_PREFIX, "jdbc:mysql://localhost:3306/blog"); + properties.setProperty(DruidConfig.DB_CONFIG_DRIVER_CLASS_NAME_PREFIX, "com.mysql.cj.jdbc.Driver"); + properties.setProperty(DruidConfig.DB_CONFIG_USERNAME_PREFIX, "username"); + properties.setProperty(DruidConfig.DB_CONFIG_PASSWORD_PREFIX, "password"); + // 保存到文件 + properties.store(new FileOutputStream(configFile), "db config"); + druidDataSource = druidConfig.initDataSource(); + assertEquals(properties.getProperty(DruidConfig.DB_CONFIG_URL_PREFIX), druidDataSource.getUrl()); + assertEquals(properties.getProperty(DruidConfig.DB_CONFIG_DRIVER_CLASS_NAME_PREFIX), druidDataSource.getDriverClassName()); + assertEquals(properties.getProperty(DruidConfig.DB_CONFIG_USERNAME_PREFIX), druidDataSource.getUsername()); + assertEquals(properties.getProperty(DruidConfig.DB_CONFIG_PASSWORD_PREFIX), druidDataSource.getPassword()); + } + + @After + public void setConfigBack() { + if (bakConfigFile.exists()) { + System.out.println("恢复配置文件成功"); + copyFile(bakConfigFile, configFile); + bakConfigFile.deleteOnExit(); + } + } + + @Before + public void recordConfig() throws IOException { + this.bakConfigFile = new File(DruidConfig.DB_CONFIG_PATH + ".bak"); + this.configFile = new File(DruidConfig.DB_CONFIG_PATH); + if (configFile.exists()) { + System.out.println("备份文件成功"); + copyFile(configFile, bakConfigFile); + } + } + + /** + * 复制文件 + * + * @param src + * @param dist + * @return + */ + private boolean copyFile(File src, File dist) { + try { + // 复制备份文件 + FileOutputStream fos = new FileOutputStream(dist); + FileInputStream fis = new FileInputStream(src); + int len = 0; + byte[] bytes = new byte[1024]; + while ((len = fis.read(bytes)) != -1) { + fos.write(bytes, 0, len); + } + fos.close(); + fis.close(); + return true; + } catch (IOException e) { + return false; + } + } +} \ No newline at end of file