1. 程式人生 > >Guice使用入門以及整合Redis

Guice使用入門以及整合Redis

guice是什麼?(借用百度百科的說明和對比)

Guice是Google開發的一個輕量級,基於Java5(主要運用泛型與註釋特性)的依賴注入框架(IOC)。Guice非常小而且快。Guice是型別安全的,它能夠對建構函式,屬性,方法(包含任意個引數的任意方法,而不僅僅是setter方法)進行注入。Guice採用Java加註解的方式進行託管物件的配置,充分利用IDE編譯器的型別安全檢查功能和自動重構功能,使得配置的更改也是型別安全的。Guice提供模組對應的抽象module,使得架構和設計的模組概念產物與程式碼中的module類一一對應,更加便利的組織和梳理模組依賴關係,利於整體應用內部的依賴關係維護,而其他IOC框架是沒有對應物的。此外,藉助privateModule的功能,可以實現模組介面的明確匯出和實現封裝,使得支援多資料來源這類需求實現起來異常簡單。

我個人的見解:對於小型獨立專案,比如:定時任務,後臺輔助程序等等,這類專案完全可以用guice實現,簡潔易懂、程式碼量少、jar包又小簡直完美啊!ps:目前我已經改造了幾個小工程了;

我的工程目錄如下:

首先新增相關依賴,開啟pom.xml

        <dependency>
            <groupId>com.google.inject</groupId>
            <artifactId>guice</artifactId>
            <version>4.2.0</version>
        </dependency>

配置檔案屬性值

redis.database=0
redis.host=10.0.2.13
redis.port=6379
redis.password=
#連線池最大連線數(使用負值表示沒有限制)
redis.pool.max.active=10000
# 連線池中的最大空閒連線
redis.pool.max.idle=100
#連線池最大阻塞等待時間(使用負值表示沒有限制)
redis.pool.max.wait=-1
# 連線池中的最小空閒連線
redis.pool.min.idle=0
# 連線超時時間(毫秒)
redis.timeout=0

新建一個redis相關的provider,用於redis配置

package com.example.provider;


import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.name.Named;
import com.yingda.xsignal2.util.redis.RedisExtendClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedisPool;

import java.util.Arrays;
import java.util.Objects;

/**
 * @author xiaofeng
 * @version V1.0
 * @title: RedisClientProvider
 * @package: com.example.provider
 * @description: TODO
 * @date 2018/6/25 17:23
 */
public class RedisClientProvider implements Provider<RedisExtendClient> {
    Logger logger = LoggerFactory.getLogger(getClass());
    @Inject
    @Named("redis.database")
    private Integer database;
    @Inject
    @Named("redis.host")
    private String host;
    @Inject
    @Named("redis.port")
    private Integer port;
    @Inject
    @Named("redis.password")
    private String password;
    @Inject
    @Named("redis.pool.max.active")
    private Integer maxActive;
    @Inject
    @Named("redis.pool.max.idle")
    private Integer maxIdle;
    @Inject
    @Named("redis.pool.max.wait")
    private Integer maxWait;
    @Inject
    @Named("redis.pool.min.idle")
    private Integer minIdle;
    @Inject
    @Named("redis.timeout")
    private Integer timeout;

    private static ShardedJedisPool shardedPool;

    private ShardedJedisPool getJedisPool() {
        if (Objects.isNull(shardedPool)) {
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxTotal(this.maxActive);
            config.setMaxWaitMillis(this.maxWait);
            config.setMaxIdle(this.maxIdle);
            config.setMinIdle(this.minIdle);
            JedisShardInfo info = new JedisShardInfo(this.host, this.port.intValue(),
                    this.timeout.intValue());
            if (this.password != null && !this.password.isEmpty()) {
                info.setPassword(password);
            }
            shardedPool = new ShardedJedisPool(config, Arrays.asList(new JedisShardInfo[]{info}));
        } else {
            logger.error("initialze operate error,please waitting.....");
            return shardedPool;
        }
        return shardedPool;
    }

    @Override
    public RedisExtendClient get() {
        return new RedisExtendClient(getJedisPool());
    }
}

新建一個module,用於繫結相關依賴關係

package com.example.module;

import com.example.provider.RedisClientProvider;
import com.example.utils.PropertyUtil;
import com.google.inject.AbstractModule;
import com.google.inject.Scopes;
import com.google.inject.name.Names;
import com.yingda.xsignal2.util.redis.RedisExtendClient;

/**
  * @author xiaofeng
  * @version V1.0
  * @title: RollbackModule
  * @package: com.example.module
  * @description: TODO
  * @date 2018/6/25 17:40
  */
public class RollbackModule extends AbstractModule {

    private String file = "config/app.properties";

    @Override
    protected void configure() {
        //繫結配置屬性
        Names.bindProperties(binder(), PropertyUtil.loadFile(file, getClass()));
//        bind(Config.class).toProvider(ConfigProvider.class);
        //繫結redis
        bind(RedisExtendClient.class).toProvider(RedisClientProvider.class).in(Scopes.SINGLETON);
    }

}

用於讀取配置檔案的util工具

package com.example.utils;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * @author xiaofeng
 * @version V1.0
 * @title: PropertyUtil
 * @package: com.example.utils
 * @description: 載入配置檔案
 * @date 2018/6/25 17:15
 */
public class PropertyUtil {

    /**
     * 讀取配置檔案屬性
     *
     * @param prefix
     * @param cla
     * @return
     */
    public static Properties loadFile(String prefix, Class<?> cla) {
        String fileName = prefix;
        Properties prop = new Properties();
        InputStream in = null;
        try {
            in = cla.getResource("/" + fileName).openStream();
            prop.load(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return prop;
    }
}

主函式入口類

package com.example;

import com.example.module.RollbackModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.yingda.xsignal2.util.redis.RedisExtendClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author xiaofeng
 * @version V1.0
 * @title: MyApplication
 * @package: com.example
 * @description: TODO
 * @date 2018/6/25 17:40
 */
public class MyApplication {

    private Logger logger = LoggerFactory.getLogger(getClass());
    private Injector injector;
    private RedisExtendClient redisExtendClient;

    private MyApplication() {
        logger.info("init something......");
        injector = Guice.createInjector(new RollbackModule());
        redisExtendClient = injector.getInstance(RedisExtendClient.class);
    }


    private void run() {
        logger.info("to do something......");
        redisExtendClient.set("test_guice","test_guice");
    }


    public static void main(String[] args) {
        MyApplication app = new MyApplication();
        try {
            app.run();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

最後啟動程式,通過redis客戶端工具檢視是否已生成相關key

至此,我們的第一個guice專案已經完成!