package com.mossle.core.jdbc; import java.lang.reflect.Method; import java.util.Collection; import java.util.Properties; import com.mossle.core.util.BeanUtils; import com.mossle.core.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; /** * 构造DataSourceService. * * @author Lingo */ public class DataSourceServiceFactoryBean implements FactoryBean, InitializingBean, DisposableBean { private static Logger logger = LoggerFactory .getLogger(DataSourceServiceFactoryBean.class); private Properties properties; private String defaultPrefix = "db"; private DataSourceService dataSourceService; // ~ ====================================================================== /** * 构建过程. * * 1.创建DataSourceService 2.通过properties设置DataSourceService初始化参数 3.通过properties创建每个DataSourceInfo * 4.把DataSourceInfo注册到dataSourceService中,并进行初始化 */ public void afterPropertiesSet() { dataSourceService = new DataSourceService(); dataSourceService.setLog4jdbcEnabled(this.checkLog4jdbcEnabled()); Collection<DataSourceInfo> dataSourceInfos = new DbcpDataSourceInfoBuilder( defaultPrefix, properties).build(); for (DataSourceInfo dataSourceInfo : dataSourceInfos) { dataSourceService.register(dataSourceInfo); } } public void destroy() { if (dataSourceService == null) { return; } for (DataSourceWrapper dataSourceWrapper : dataSourceService .getDataSources()) { dataSourceWrapper.close(); } } // ~ ====================================================================== public Object getObject() { return dataSourceService; } public Class getObjectType() { return DataSourceService.class; } public boolean isSingleton() { return true; } // ~ ====================================================================== private boolean checkLog4jdbcEnabled() { return Boolean.parseBoolean(properties.getProperty("log4jdbc.enable")); } // ~ ====================================================================== public void setProperties(Properties properties) { this.properties = properties; } public void setDefaultPrefix(String defaultPrefix) { if (StringUtils.isEmpty(defaultPrefix)) { logger.info("defaultPrefix cannot be null or empty"); return; } this.defaultPrefix = defaultPrefix; } public String export() { StringBuilder buff = new StringBuilder(); for (DataSourceInfo dataSourceInfo : dataSourceService .getDataSourceInfos()) { String prefix = defaultPrefix + "." + dataSourceInfo.getName() + "."; for (Method method : dataSourceInfo.getClass().getDeclaredMethods()) { String methodName = method.getName(); if (methodName.startsWith("get") || methodName.startsWith("is")) { String fieldName = BeanUtils.getFieldName(methodName); Object fieldValue = BeanUtils.safeInvokeMethod( dataSourceInfo, method); buff.append(prefix).append(fieldName).append("=") .append(fieldValue).append("\n"); } } } return buff.toString(); } }