<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jimi.lijie.guice</groupId>
<artifactId>guicetest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-guice</artifactId>
<version>3.6</version>
</dependency>
<dependency>
<groupId>com.google.inject.extensions</groupId>
<artifactId>guice-multibindings</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.14</version>
<exclusions>
<exclusion>
<artifactId>tools</artifactId>
</exclusion>
<exclusion>
<artifactId>jconsole</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
</dependencies>
</project>
package com.jimi.guice.guicetest
import java.util.List
import com.google.common.collect.Lists
import com.google.inject.Guice
import com.google.inject.Inject
import com.google.inject.Injector
import com.google.inject.Module
import com.jimi.guice.guicetest.service.UserService
import com.jimi.guice.guicetest.util.multipledatasource.MultipleDataSoruceModule
public class StartUp {
private static Injector ctx
public static void main(String[] args) {
//userService.print()
initCtx()
UserService userService = ctx.getInstance(UserService.class)
userService.getToken()
}
public static void initCtx(){
List<Module> modules =Lists.newArrayList()
//加載Mybatis模塊
modules.addAll( MultipleDataSoruceModule.getModules())
//創建
ctx=Guice.createInjector(modules)
}
}
package com.jimi.guice.guicetest.util;
import java.io.InputStream;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.log4j.Logger;
public class ConfigUtil {
private static final Logger log=Logger.getLogger(ConfigUtil.class);
public static Map<String,String> dynamicConfigsCach=null;
private static Properties props;
static{
try {
log.info("load config from:"+ConfigUtil.class.getClassLoader().getResource("").getPath()+"config.properties" );
InputStream propsStream = ConfigUtil.class.getClassLoader().getResourceAsStream("config.properties");
props=new Properties();
props.load(propsStream);
} catch (Exception e) {
log.error("加載config.properties出錯,系統錯誤:" + e);
e.printStackTrace();
}
}
/**
*
* @param name
* @return
*/
public static String getString(String name){
return props.getProperty(name);
}
/**
*
* @param name
* @return
*/
public static String getString(String name,String def){
String val=props.getProperty(name);
if(StringUtils.isBlank(val)){
val=def;
}
return val;
}
/**
*
* @param name
* @return
*/
public static int getInt(String name){
String strValue=getString(name);
return NumberUtils.toInt(strValue, 0);
}
/**
*
* @param name
* @return
*/
public static int getInt(String name,int def){
String strValue=getString(name);
return NumberUtils.toInt(strValue, def);
}
public static void main(String[] args) {
log.info("tst");
}
}
package com.jimi.guice.guicetest.util.multipledatasource;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import org.apache.ibatis.io.ResolverUtil;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.mybatis.guice.MyBatisModule;
import com.google.common.collect.Lists;
import com.google.inject.PrivateModule;
import com.google.inject.name.Names;
import com.jimi.guice.guicetest.util.ConfigUtil;
public class MultipleDataSoruceModule {
@Documented
@Retention(RetentionPolicy.RUNTIME)
public static @interface JimiDataSource {
String value() default "";
}
/**
* 數據源
* @author chengxuwei
*
*/
public static enum DataSoruce{
lbs,
mycat
}
/**
* 獲取配置文件
* @param ds
* @return
*/
private static Properties getConfig(DataSoruce ds){
Properties prop=new Properties();
String dsString=ds.toString();
prop.put("mybatis.environment.id",dsString);
prop.setProperty("JDBC.driver",ConfigUtil.getString("JDBC.driverClassName"));
prop.setProperty("JDBC.url",ConfigUtil.getString("JDBC."+dsString+".url"));
prop.setProperty("JDBC.username", ConfigUtil.getString("JDBC."+dsString+".username"));
prop.setProperty("JDBC.password", ConfigUtil.getString("JDBC."+dsString+".password"));
return prop;
}
/**
* 獲取Mapper包
* @param ds
* @return
*/
private static String getMapperPackage(DataSoruce ds){
String pack=ConfigUtil.getString("mybatis.mapper","com.jimi.lbs.mapper");
return pack;
}
/**
* 獲取Mapper包
* @param ds
* @return
*/
private static String getModelPackage(DataSoruce ds){
String pack=ConfigUtil.getString("mybatis.model","com.jimi.lbs.model");
return pack;
}
/**
*
*/
public static List<PrivateModule> getModules(){
List<PrivateModule> mybatisModules=Lists.newArrayList();
DataSoruce[] dsList = DataSoruce.values();
for (int i = 0; i < dsList.length; i++) {
final DataSoruce ds=dsList[i];
mybatisModules.add(new PrivateModule() {
@Override
protected void configure() {
final String mapperPackage=getMapperPackage(ds);
final String modelPackage=getModelPackage(ds);
Names.bindProperties(this.binder(),getConfig(ds));
install(new MyBatisModule() {
@Override
protected void initialize() {
bindDataSourceProviderType(DruidDataSourceProvider.class);
bindTransactionFactoryType(JdbcTransactionFactory.class);
ResolverUtil< Object> util=new ResolverUtil< Object>();
Set<Class<? extends Object>> mapers = util.findImplementations(Object.class, mapperPackage).getClasses();
for (Class<? extends Object> class1 : mapers) {
JimiDataSource dsn=class1.getAnnotation(JimiDataSource.class);
if(dsn!=null)
{
String dsName=ds.toString();
if(dsName.equals(dsn.value()))
{
addMapperClass(class1);
expose(class1);
}
}
}
addSimpleAliases(modelPackage);
}
});
}
});
}
return mybatisModules;
}
}
package com.jimi.guice.guicetest.util.multipledatasource;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Provider;
import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSource;
public final class DruidDataSourceProvider implements Provider<DataSource> {
private final DruidDataSource dataSource = new DruidDataSource();
/**
* Creates a new ComboPooledDataSource using the needed parameter.
*
* @param driver The JDBC driver class.
* @param url the database URL of the form <code>jdbc:subprotocol:subname</code>.
* @param username the database user.
* @param password the user's password.
*/
@Inject
public void setDriverClass(@Named("JDBC.driver") final String driverClass) {
dataSource.setDriverClassName(driverClass);
}
@Inject
public void setJdbcUrl(@Named("JDBC.url") String jdbcUrl) {
dataSource.setUrl(jdbcUrl);
}
@Inject
public void setUsername(@Named("JDBC.username") String username) {
dataSource.setUsername(username);
}
@Inject
public void setPassword(@Named("JDBC.password") String password) {
dataSource.setPassword(password);
}
/**
* {@inheritDoc}
*/
public DataSource get() {
return dataSource;
}
}