Springboot bean注入 ---- Jedis注入

Posted mangues

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Springboot bean注入 ---- Jedis注入相关的知识,希望对你有一定的参考价值。

一、在springmvc中我们注入bean使用了xml方式,如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">

    <!--RedisDao-->
    <bean id="redisDao" class="com.mangues.cache.RedisDao">
        <constructor-arg index="0" value="$redis.ip"/>
        <constructor-arg index="1" value="$redis.port"/>
        <constructor-arg index="2" value="500"/>
        <constructor-arg index="3" value="5"/>
        <constructor-arg index="4" value="$redis.timeout"/>
    </bean>

</beans>

RedisDao代码:

public class RedisDao 
    private final Logger logger = LoggerFactory.getLogger(getClass());
    private final JedisPool jedisPool;
    public RedisDao(String ip, int port, int maxTotal, int maxIdle, long waitMill)

        JedisPoolConfig config = new JedisPoolConfig();
        //控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;
        //如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
        config.setMaxTotal(maxTotal);
        //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
        config.setMaxIdle(maxIdle);
        //表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;
        config.setMaxWaitMillis(waitMill);
        //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
        config.setTestOnBorrow(true);

        jedisPool = new JedisPool(config,ip,port);
    

    public <T> T getBean(String key,Class<T> targetClass)
        try 
            Jedis jedis = jedisPool.getResource();
            try
//               byte[] bytes =  jedis.get(key.getBytes());
               String bytes =  jedis.get(key);
                if (bytes!=null)
//                    T result = ProtoStuffSerializerUtil.deserialize(bytes, targetClass);
                    T result = JSON.parseObject(bytes,targetClass);
                    return result;
                
            finally 
                jedis.close();
            
        catch (Exception e)
            logger.error(JSON.toJSONString(e));
        
        return null;
    

使用的时候直接就可以使用了

  @Autowired
  private RedisDao redisDao;

二、在springboot我们可以使用bean注解来实现bean的注入

@Configuration
public class RedisDao
    private final Logger logger = LoggerFactory.getLogger(getClass());
    private  JedisPool jedisPool;
    @Value("$spring.redis.ip")
    private String ip;
    @Value("$spring.redis.port")
    private int port;
    @Value("$spring.redis.maxTotal")
    private int maxTotal;
    @Value("$spring.redis.maxIdle")
    private int maxIdle;
    @Value("$spring.redis.waitMill")
    private long waitMill;
    @Bean
    public RedisDao redisFactory()
        JedisPoolConfig config = new JedisPoolConfig();
        //控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;
        //如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
        config.setMaxTotal(maxTotal);
        //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
        config.setMaxIdle(maxIdle);
        //表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;
        config.setMaxWaitMillis(waitMill);
        //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
        config.setTestOnBorrow(true);

        jedisPool = new JedisPool(config,ip,port);
        return new RedisDao();
    

    public <T> T getBean(String key,Class<T> targetClass)
        try 
            Jedis jedis = jedisPool.getResource();
            try
//               byte[] bytes =  jedis.get(key.getBytes());
               String bytes =  jedis.get(key);
                if (bytes!=null)
//                    T result = ProtoStuffSerializerUtil.deserialize(bytes, targetClass);
                    T result = JSON.parseObject(bytes,targetClass);
                    return result;
                
            finally 
                jedis.close();
            
        catch (Exception e)
            logger.error("Exception",e);
        
        return null;
    

    public <T> String putBean(String key,T object)
       return putBean( key,object,60*60);
    

代码都差不多 只要加入这连个注解就行了,spring 就会把new 的RedisDao注入到上下文中。

注意:bean注解的方法一定要是 **Factory 这种命名,不然会出错

    @Configuration
    public class RedisDao
        ...
    

    @Bean
    public RedisDao redisFactory()
        ...
        return new RedisDao();
    

以上是关于Springboot bean注入 ---- Jedis注入的主要内容,如果未能解决你的问题,请参考以下文章

Springboot bean注入 ---- Jedis注入

SpringBoot拦截器中Bean无法注入(转)

SpringBoot Filter中注入Bean

springboot中如果使用了@Autowired注入了bean,则这个类也要为spring bean,new出来注入的bean为null

bean无法被注入的常见问题和springboot的三种扫描并加载Bean方式

springBoot bean注入