一、在工作可能涉及到对 JedisCluster进行代理,但涉及到@Service和@Configuration加载顺序和对jedisCluster接口,容易出错。故在这个写一个样例,做下记录。
(1) 对JedisCluster 进行 示例化bean,这个在之前一篇文章有过记录
https://blog.csdn.net/fajing_feiyue/article/details/101639865
(2)对JedisCluster 调用方法前后进行,具体操作
public class JedisProxyHandler implements InvocationHandler {
private JedisCluster jedisCluster;
private final Logger logger = LoggerFactory.getLogger(JedisCluster.class);
public JedisProxyHandler(JedisCluster jedisCluster) {
this.jedisCluster = jedisCluster;
}
//public Object bind(JedisCluster i) {
// jedisCluster = i;
// Object wrappedInter = Proxy.newProxyInstance(jedisCluster.getClass().getClassLoader(), i.getClass().getInterfaces(), this);
// return wrappedInter;
// }
@Override
public Object invoke(Object proxy, Method method, Object[] args) {
System.out.println("调用之前处理");
Object result = null;
try {
result= method.invoke(jedisCluster, args);
} catch (Exception e) {
logger.error("jedis get error:"+e.getMessage());
}
System.out.println("调用之后处理");
return result;
}
}
(3)对需要代理接口方法进行定义
public interface JedisProxyService {
String set(String key, String value);
String get(String key);
}
(3)获取代理对象,通过代理对象去操作redis
public class JedisProxyServiceImpl implements JedisProxyService {
private static final Logger LOGGER = LoggerFactory.getLogger(JedisProxyServiceImpl.class);
private AllJedisCommands allJedisCommands;
public JedisProxyServiceImpl(JedisCluster jedisCluster) {
try {
this.allJedisCommands = (AllJedisCommands) Proxy.newProxyInstance(jedisCluster.getClass().getClassLoader(),
new Class[]{AllJedisCommands.class}, new JedisProxyHandler(jedisCluster));
} catch (Exception e) {
LOGGER.error("jedis init failure");
}
}
@Override
public String set(String key, String value) {
return allJedisCommands.set(key, value);
}
@Override
public String get(String key) {
return allJedisCommands.get(key);
}
}
public interface AllJedisCommands extends JedisCommands, MultiKeyJedisClusterCommands,
JedisClusterScriptingCommands, BasicCommands, BinaryJedisClusterCommands,
MultiKeyBinaryCommands, JedisClusterBinaryScriptingCommands {
}
(4) 将代理对象通过 @Configuration 进行管理,这里涉及到 @Bean 和@Service示例化的先后顺序
@Configuration
public class JedisConfigurator {
@Autowired
private JedisCluster jedisCluster;
@Bean
public JedisProxyService jedisProxyService(){
return new JedisProxyServiceImpl(jedisCluster);
}
}
写测试类对JedisProxyService 进行代理测试
@SpringBootTest
@RunWith(SpringRunner.class)
public class DemoTest {
@Autowired
JedisProxyService jedisProxyService;
@Test
public void test01() {
jedisProxyService.set("keyDemo01", "valueDemo01");
System.out.println("----------------");
String keyDemo01 = jedisProxyService.get("keyDemo01");
System.out.println("获取jedis结果:"+keyDemo01);
}
}
测试结果:
调用之前处理
调用之后处理
----------------
调用之前处理
调用之后处理
获取jedis结果:valueDemo01