zoukankan      html  css  js  c++  java
  • spring 整合redis集群中使用@autowire无效问题的解决办法

    1、视频参考黑马32期宜立方商城第6课

    redis对于的代码

    我们先变向一个redis客户端的接口文件

    package com.test;
    public interface JedisClient {
    
        String set(String key, String value);
        String get(String key);
        Boolean exists(String key);
        Long expire(String key, int seconds);
        Long ttl(String key);
        Long incr(String key);
        Long hset(String key, String field, String value);
        String hget(String key, String field);
        Long hdel(String key, String... field);
    }

    单机版:

    package com.test;
    
    
    import redis.clients.jedis.HostAndPort;
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    
    public class JedisClientPool implements JedisClient {
        
    
        public JedisPool getJedisPool() {
            return jedisPool;
        }
    
        public void setJedisPool(JedisPool jedisPool) {
            this.jedisPool = jedisPool;
        }
    
        private JedisPool jedisPool;
    
        @Override
        public String set(String key, String value) {
            Jedis jedis = jedisPool.getResource();
            String result = jedis.set(key, value);
            jedis.close();
            return result;
        }
    
        @Override
        public String get(String key) {
            Jedis jedis = jedisPool.getResource();
            String result = jedis.get(key);
            jedis.close();
            return result;
        }
    
        @Override
        public Boolean exists(String key) {
            Jedis jedis = jedisPool.getResource();
            Boolean result = jedis.exists(key);
            jedis.close();
            return result;
        }
    
        @Override
        public Long expire(String key, int seconds) {
            Jedis jedis = jedisPool.getResource();
            Long result = jedis.expire(key, seconds);
            jedis.close();
            return result;
        }
    
        @Override
        public Long ttl(String key) {
            Jedis jedis = jedisPool.getResource();
            Long result = jedis.ttl(key);
            jedis.close();
            return result;
        }
    
        @Override
        public Long incr(String key) {
            Jedis jedis = jedisPool.getResource();
            Long result = jedis.incr(key);
            jedis.close();
            return result;
        }
    
        @Override
        public Long hset(String key, String field, String value) {
            Jedis jedis = jedisPool.getResource();
            Long result = jedis.hset(key, field, value);
            jedis.close();
            return result;
        }
    
        @Override
        public String hget(String key, String field) {
            Jedis jedis = jedisPool.getResource();
            String result = jedis.hget(key, field);
            jedis.close();
            return result;
        }
    
        @Override
        public Long hdel(String key, String... field) {
            Jedis jedis = jedisPool.getResource();
            Long result = jedis.hdel(key, field);
            jedis.close();
            return result;
        }
    
    }

    集群版:

    package com.test;
    
    
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    import redis.clients.jedis.JedisCluster;
    
    public class JedisClientCluster implements JedisClient {
        
    
        
        @Autowired
        private JedisCluster jedisCluster;
    
        @Override
        public String set(String key, String value) {
            return jedisCluster.set(key, value);
        }
    
        @Override
        public String get(String key) {
            return jedisCluster.get(key);
        }
    
        @Override
        public Boolean exists(String key) {
            return jedisCluster.exists(key);
        }
    
        @Override
        public Long expire(String key, int seconds) {
            return jedisCluster.expire(key, seconds);
        }
    
        @Override
        public Long ttl(String key) {
            return jedisCluster.ttl(key);
        }
    
        @Override
        public Long incr(String key) {
            return jedisCluster.incr(key);
        }
    
        @Override
        public Long hset(String key, String field, String value) {
            return jedisCluster.hset(key, field, value);
        }
    
        @Override
        public String hget(String key, String field) {
            return jedisCluster.hget(key, field);
        }
    
        @Override
        public Long hdel(String key, String... field) {
            return jedisCluster.hdel(key, field);
        }
        
    
    }

    我们编写一个applicationContext-redis.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
        xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" 
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
        http://www.springfamework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">
    
       <bean class="com.test.JedisClientCluster"></bean>
        
        
        <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
         <constructor-arg>
             <set>
               <bean class="redis.clients.jedis.HostAndPort">
                  <constructor-arg name="host" value="192.168.25.111"></constructor-arg>
                  <constructor-arg name="port" value="7001"></constructor-arg>
               </bean>
               
                 <bean class="redis.clients.jedis.HostAndPort">
                  <constructor-arg name="host" value="192.168.25.111"></constructor-arg>
                  <constructor-arg name="port" value="7002"></constructor-arg>
               </bean>
                 <bean class="redis.clients.jedis.HostAndPort">
                  <constructor-arg name="host" value="192.168.25.111"></constructor-arg>
                  <constructor-arg name="port" value="7003"></constructor-arg>
               </bean>
                 <bean class="redis.clients.jedis.HostAndPort">
                  <constructor-arg name="host" value="192.168.25.111"></constructor-arg>
                  <constructor-arg name="port" value="7004"></constructor-arg>
               </bean>
                 <bean class="redis.clients.jedis.HostAndPort">
                  <constructor-arg name="host" value="192.168.25.111"></constructor-arg>
                  <constructor-arg name="port" value="7005"></constructor-arg>
               </bean>
                 <bean class="redis.clients.jedis.HostAndPort">
                  <constructor-arg name="host" value="192.168.25.111"></constructor-arg>
                  <constructor-arg name="port" value="7006"></constructor-arg>
               </bean>
             
             </set>
         </constructor-arg>
        </bean>
    </beans>

    我们编写一个测试代码来进行测试

    package com.e3mall.test;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.test.JedisClientCluster;
    
    public class TestRedis {
    
        @Test
        public void testRedis(){
         ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-redis.xml");
         JedisClientCluster clientCluster =applicationContext.getBean(JedisClientCluster.class);
         clientCluster.hset("jjj", "sdjj", "111");
         String hget = clientCluster.hget("jjj", "sdjj");
         System.out.println(hget);
        }
    }

    运行的时候出现下面的情况

    出现了jedisCluster这个对象为null,

    说明

        @Autowired
        private JedisCluster jedisCluster;
    这个注入没有起到效果
    为啥出现这个情况了
    https://blog.csdn.net/bluetjs/article/details/45368769

    在基于主机方式配置Spring的配置文件中,你可能会见到<context:annotation-config/>这样一条配置,他的作用是式地向 Spring 容器注册

    AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、

    PersistenceAnnotationBeanPostProcessor 以及 RequiredAnnotationBeanPostProcessor 这 4 个BeanPostProcessor。

    注册这4个 BeanPostProcessor的作用,就是为了你的系统能够识别相应的注解。

    例如:

    如果你想使用@Autowired注解,那么就必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean。传统声明方式如下:

    
    
    1. <bean class="org.springframework.beans.factory.annotation. AutowiredAnnotationBeanPostProcessor "/> 

    如果想使用@ Resource 、@ PostConstruct、@ PreDestroy等注解就必须声明CommonAnnotationBeanPostProcessor

    如果想使用@PersistenceContext注解,就必须声明PersistenceAnnotationBeanPostProcessor的Bean。

    如果想使用 @Required的注解,就必须声明RequiredAnnotationBeanPostProcessor的Bean。同样,传统的声明方式如下:

    
    
    1. <bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/> 

    一般来说,这些注解我们还是比较常用,尤其是Antowired的注解,在自动注入的时候更是经常使用,所以如果总是需要按照传统的方式一条一条配置显得有些繁琐和没有必要,于是spring给我们提供<context:annotation-config/>的简化配置方式,自动帮你完成声明。

       不过,呵呵,我们使用注解一般都会配置扫描包路径选项

    
    
    1. <context:component-scan base-package=”XX.XX”/> 

        该配置项其实也包含了自动注入上述processor的功能,因此当使用 <context:component-scan/> 后,就可以将 <context:annotation-config/> 移除了。

    本文出自 “苦逼coder” 博客,请务必保留此出处http://mushiqianmeng.blog.51cto.com/3970029/723880

    为了解决上面的问题:

    我们需要在xml文件中配置:

    方法一:<context:annotation-config/>

    方法2:添加包扫描:

    1. <context:component-scan base-package=”XX.XX”/> 
  • 相关阅读:
    iOS 9音频应用播放音频之第一个ios9音频实例2
    隐写术: 基地组织如何用视频隐藏绝密文档?
    stm32 Fatfs 读写SD卡
    STM32应用笔记转载
    STM32-NVIC中断管理实现[直接操作寄存器]
    FatFs源码剖析
    STM32固件库详解(转)
    Arduino线程库ProtoThreads
    ARM9(TQ2440)裸机代码分享
    将USBASP改造成STK502编程器(转)
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/9172853.html
Copyright © 2011-2022 走看看