InvocationHandler 实现 对JedisCluster 实现代理

mac2022-06-30  21

一、在工作可能涉及到对 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
最新回复(0)