Guice使用入門以及整合Redis
阿新 • • 發佈:2018-12-17
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專案已經完成!