com.gitee.sunchenbin.mybatis.actable.manager.util.ConfigurationUtil Maven / Gradle / Ivy
package com.gitee.sunchenbin.mybatis.actable.manager.util;
import java.lang.reflect.Method;
import java.util.Properties;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.PropertyResourceConfigurer;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.io.support.PropertiesLoaderSupport;
import org.springframework.stereotype.Component;
import com.gitee.sunchenbin.mybatis.actable.constants.Constants;
@Component
public class ConfigurationUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
private static Properties properties = null;
/**
* 旧的配置key,兼容老版本用的
*/
@Value(Constants.TABLE_AUTO_KEY_VALUE)
private String tableAuto;
/**
* 旧的配置key,兼容老版本用的
*/
@Value(Constants.MODEL_PACK_KEY_VALUE)
private String modelPack;
/**
* 旧的配置key,兼容老版本用的
*/
@Value(Constants.DATABASE_TYPE_KEY_VALUE)
private String databaseType;
/**
* 新的配置key
*/
@Value(Constants.ACTABLE_TABLE_AUTO_KEY_VALUE)
private String actableAuto;
/**
* 新的配置key
*/
@Value(Constants.ACTABLE_MODEL_PACK_KEY_VALUE)
private String acmodelPack;
/**
* 新的配置key
*/
@Value(Constants.ACTABLE_DATABASE_TYPE_KEY_VALUE)
private String acdatabaseType;
/**
* 实现ApplicationContextAware接口的回调方法,设置上下文环境
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
ConfigurationUtil.applicationContext = applicationContext;
}
/**
* 获得spring上下文
*
* @return ApplicationContext spring上下文
*/
public ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 获取bean
*
* @param name
* service注解方式name为小驼峰格式
* @return Object bean的实例对象
*/
public Object getBean(String name) throws BeansException {
return applicationContext.getBean(name);
}
/**
* 获取配置文件的值,兼容传统spring项目和springboot项目
*
* @param key
* properties
* @return
*/
public String getConfig(String key) {
if(Constants.ACTABLE_DATABASE_TYPE_KEY.equals(key) || Constants.DATABASE_TYPE_KEY.equals(key)) {
if (!Constants.NULL.equals(databaseType)){
return databaseType;
}else if(!Constants.NULL.equals(acdatabaseType)){
return acdatabaseType;
}
}
if(Constants.ACTABLE_MODEL_PACK_KEY.equals(key) || Constants.MODEL_PACK_KEY.equals(key)) {
if (!Constants.NULL.equals(modelPack)){
return modelPack;
}else if(!Constants.NULL.equals(acmodelPack)){
return acmodelPack;
}
}
if(Constants.ACTABLE_TABLE_AUTO_KEY.equals(key) || Constants.TABLE_AUTO_KEY.equals(key)) {
if (!Constants.NULL.equals(tableAuto)){
return tableAuto;
}else if(!Constants.NULL.equals(actableAuto)){
return actableAuto;
}
}
if(properties == null) {
initProperties();
}
Object object = null;
if(Constants.ACTABLE_DATABASE_TYPE_KEY.equals(key) || Constants.DATABASE_TYPE_KEY.equals(key)) {
object = properties.get(Constants.DATABASE_TYPE_KEY);
if (null == object){
object = properties.get(Constants.ACTABLE_DATABASE_TYPE_KEY);
}
}
if(Constants.ACTABLE_MODEL_PACK_KEY.equals(key) || Constants.MODEL_PACK_KEY.equals(key)) {
object = properties.get(Constants.MODEL_PACK_KEY);
if (null == object){
object = properties.get(Constants.ACTABLE_MODEL_PACK_KEY);
}
}
if(Constants.ACTABLE_TABLE_AUTO_KEY.equals(key) || Constants.TABLE_AUTO_KEY.equals(key)) {
object = properties.get(Constants.TABLE_AUTO_KEY);
if (null == object){
object = properties.get(Constants.ACTABLE_TABLE_AUTO_KEY);
}
}
return object == null ? null : (String)object;
}
private void initProperties() {
properties = new Properties();
try {
String[] postProcessorNames = applicationContext.getBeanNamesForType(BeanFactoryPostProcessor.class, true,
true);
for (String ppName : postProcessorNames) {
BeanFactoryPostProcessor beanProcessor = applicationContext.getBean(ppName,
BeanFactoryPostProcessor.class);
if (beanProcessor instanceof PropertyResourceConfigurer) {
PropertyResourceConfigurer propertyResourceConfigurer = (PropertyResourceConfigurer) beanProcessor;
Method mergeProperties = PropertiesLoaderSupport.class.getDeclaredMethod("mergeProperties");
mergeProperties.setAccessible(true);
Properties props = (Properties) mergeProperties.invoke(propertyResourceConfigurer);
// get the method convertProperties
// in class PropertyResourceConfigurer
Method convertProperties = PropertyResourceConfigurer.class.getDeclaredMethod("convertProperties",
Properties.class);
// convert properties
convertProperties.setAccessible(true);
convertProperties.invoke(propertyResourceConfigurer, props);
properties.putAll(props);
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}