guice入門-多數據源

<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 ;

    /*@Inject
    private static UserService userService;*/
    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{
        //加載properties配置
        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"));
//      prop.setProperty("JDBC.autoCommit", "false");
//      prop.setProperty("mybatis.pooled.maximumActiveConnections", "20");
//      prop.setProperty("mybatis.pooled.maximumCheckoutTime", "60000");
//      prop.setProperty("mybatis.pooled.maximumIdleConnections", "10");
//      prop.setProperty("mybatis.pooled.pingQuery", "SELECT NOW() AS pintTime");
//      prop.setProperty("mybatis.pooled.pingEnabled", "true");
//      prop.setProperty("mybatis.pooled.pingConnectionsNotUsedFor", "3600000");
//      prop.setProperty("mybatis.pooled.timeToWait", "20000");
//      prop.setProperty("logImpl", "LOG4J");
// 

        return prop;
    }
    /**
     * 獲取Mapper包
     * @param ds
     * @return
     */
    private static String getMapperPackage(DataSoruce ds){
        //String pack="com.jimi.lbs.mapper";
        String pack=ConfigUtil.getString("mybatis.mapper","com.jimi.lbs.mapper");
        return pack;
    }
    /**
     * 獲取Mapper包
     * @param ds
     * @return
     */
    private static String getModelPackage(DataSoruce ds){
        //String pack="com.jimi.lbs.model";
        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(org.mybatis.guice.datasource.builtin.PooledDataSourceProvider.class);
                            bindDataSourceProviderType(DruidDataSourceProvider.class);
                            bindTransactionFactoryType(JdbcTransactionFactory.class);
//                          addInterceptorClass(MybatisInterceptor.class);
                            //addMapperClasses(mapperPackage);
                          //導出接口列表
                            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;
    }


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章