经过试验得知,Spring注入Bean,实例化一个Bean的时候,顺序如下:
1. 这个class的构造函数被执行;
2.Setter被执行;
3.如果这个class实现了InitializingBean(即implements InitializingBean)则,接下来执行public void afterPropertiesSet() throws Exception() 中的内容。
实例,
当我不用InitializingBean 方法,而是直接在构造器中知己执行jedis = jedisPool.getResource(); 则因为此时程序只是执行到上面的第1步,这时候jedisPool==null,那这里肯定会报错。会导致RedisClient实例化失败,并且抛出NullPointerException
下面贴上错误的代码。注意这里对RedisClient进行了Spring的Setter注入。
package com.foundjet.flylib.redis;
import java.util.ArrayList;
import java.util.List;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;
import redis.clients.jedis.JedisShardInfo;
public class RedisClient {
private Jedis jedis;//非切片额客户端连接
private JedisPool jedisPool;//非切片连接池
private ShardedJedis shardedJedis;//切片额客户端连接
private ShardedJedisPool shardedJedisPool;//切片连接池
private String password = "tea@fjdev";
public RedisClient()
{
initialPool();
// initialShardedPool();
jedis = jedisPool.getResource();
jedis.auth(password);
jedis.select(10);
// shardedJedis = shardedJedisPool.getResource();
}
/**
* 初始化非切片池
*/
private void initialPool()
{
// 池基本配置
JedisPoolConfig config = new JedisPoolConfig();
// config.setMaxActive(20);
config.setMaxTotal(20);
config.setMaxIdle(5);
config.setMaxWaitMillis(1000L);
config.setTestOnBorrow(false);
jedisPool = new JedisPool(config, "127.0.0.1", 6379);
}
/**
* 初始化切片池
*/
private void initialShardedPool()
{
// 池基本配置
JedisPoolConfig config = new JedisPoolConfig();
// config.setMaxActive(20);
config.setMaxTotal(20);
config.setMaxIdle(5);
config.setMaxWaitMillis(1000l);
config.setTestOnBorrow(false);
// slave链接
List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();
shards.add(new JedisShardInfo("127.0.0.1", 6379, "master"));
// 构造池
shardedJedisPool = new ShardedJedisPool(config, shards);
}
public void show() {
keyOperate();
// StringOperate();
// ListOperate();
// SetOperate();
// SortedSetOperate();
// HashOperate();
jedis.close();
// shardedJedis.close();
}
private void keyOperate() {
String k = "key3";
jedis.set(k, "ccc");
System.out.println("value of " + k + " is: " + jedis.get(k));
}
public static void main(String[] args) {
RedisClient client = new RedisClient();
client.show();
}
}
修正后的代码见 https://github.com/flylib/rediskit
RedisClient.java
片段如下
package net.flylib.rediskit;
import org.springframework.beans.factory.InitializingBean;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Protocol;
public class RedisClient implements InitializingBean {
private Jedis jedis;// 非切片额客户端连接
private JedisPool jedisPool;// 非切片连接池
public RedisClient() {
// jedis = jedisPool.getResource();
}
@Override
public void afterPropertiesSet() throws Exception {
jedis = jedisPool.getResource();
}
public JedisPool getJedisPool() {
return jedisPool;
}
public void setJedisPool(JedisPool jedisPool) {
this.jedisPool = jedisPool;
}
public String set(final String key, String value) {
jedis.get("");
return jedis.set(key, value);
}
public String get(final String key) {
return jedis.get(key);
}
}