package com.szkunton.product.config; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.context.EnvironmentAware; import org.springframework.core.Ordered; import org.springframework.core.PriorityOrdered; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.Environment; import org.springframework.core.env.MutablePropertySources; import org.springframework.core.env.PropertySource; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; @Component public class PropertySourcesProcessor implements BeanFactoryPostProcessor, EnvironmentAware, PriorityOrdered { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { } @Override public void setEnvironment(Environment environment) { MutablePropertySources propertySources = ((ConfigurableEnvironment)environment).getPropertySources(); String osName = environment.getProperty("os.name"); for (PropertySource<?> propertySource : propertySources) { String name = propertySource.getName(); if("applicationConfig: [classpath:/application-DEV.properties]".equals(name) && osName.startsWith("Windows")){ LinkedHashMap source = (LinkedHashMap) propertySource.getSource(); String jdbcUrl = source.get("spring.datasource.url").toString(); String jdbcHost = getJdbcUrlHost(jdbcUrl); String db = getJdbcDb(jdbcUrl); Map<String,String> ipMap = new HashMap<>(); ipMap.put("12.18.0.3","19.0.3.36"); String url = String.format("jdbc:mysql://%s:3306/%s?useSSL=false&useLegacyDatetimeCode=false&serverTimezone=Hongkong", ipMap.get(jdbcHost), db); source.put("spring.datasource.url",url); break; } } } @Override public int getOrder() { return Ordered.HIGHEST_PRECEDENCE; } /** * 獲取jdbcUrl 上的host */ private String getJdbcUrlHost(String jdbcUrl){ int start = "jdbc:mysql://".length(); int end = jdbcUrl.indexOf(":3306"); return jdbcUrl.substring(start, end); } /** * 獲取jdbcUrl 上的db */ private String getJdbcDb(String jdbcUrl){ int start = jdbcUrl.indexOf("3306/") + 5; int end = jdbcUrl.indexOf("?"); return jdbcUrl.substring(start, end); } }