jedisKeys空指针问题

来源:11-3 引入缓存技术之理论讲解

qq_淡定_49

2019-11-25

老师,我在util文件下
@Autowired
private JedisUtil.Keys jedisKeys;
我发现jedisKeys是空的,但是我在service文件下写,我发现是获取到的,这个为什么呢。

写回答

3回答

翔仔

2019-11-27

同学好,如果是springboot的话,不能这么定义的呢,毕竟你bean的名字并没有叫做JedisUtil.Keys,所以@Autowired找不到对应的bean,你可以参考我的进行定义

package com.imooc.o2o.config.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.imooc.o2o.cache.JedisPoolWriper;
import com.imooc.o2o.cache.JedisUtil;

import redis.clients.jedis.JedisPoolConfig;

/**
 * spring-redis.xml里的配置
 * 
 * @author xiangze
 *
 */
@Configuration
public class RedisConfiguration {
	@Value("${redis.hostname}")
	private String hostname;
	@Value("${redis.port}")
	private int port;
	@Value("${redis.pool.maxActive}")
	private int maxTotal;
	@Value("${redis.pool.maxIdle}")
	private int maxIdle;
	@Value("${redis.pool.maxWait}")
	private long maxWaitMillis;
	@Value("${redis.pool.testOnBorrow}")
	private boolean testOnBorrow;

	@Autowired
	private JedisPoolConfig jedisPoolConfig;
	@Autowired
	private JedisPoolWriper jedisWritePool;
	@Autowired
	private JedisUtil jedisUtil;

	/**
	 * 创建redis连接池的设置
	 * 
	 * @return
	 */
	@Bean(name = "jedisPoolConfig")
	public JedisPoolConfig createJedisPoolConfig() {
		JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
		// 控制一个pool可分配多少个jedis实例
		jedisPoolConfig.setMaxTotal(maxTotal);
		// 连接池中最多可空闲maxIdle个连接 ,这里取值为20,
		// 表示即使没有数据库连接时依然可以保持20空闲的连接,
		// 而不被清除,随时处于待命状态。
		jedisPoolConfig.setMaxIdle(maxIdle);
		// 最大等待时间:当没有可用连接时,
		// 连接池等待连接被归还的最大时间(以毫秒计数),超过时间则抛出异常
		jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
		// 在获取连接的时候检查有效性
		jedisPoolConfig.setTestOnBorrow(testOnBorrow);
		return jedisPoolConfig;
	}

	/**
	 * 创建Redis连接池,并做相关配置
	 * 
	 * @return
	 */
	@Bean(name = "jedisWritePool")
	public JedisPoolWriper createJedisPoolWriper() {
		JedisPoolWriper jedisPoolWriper = new JedisPoolWriper(jedisPoolConfig, hostname, port);
		return jedisPoolWriper;
	}

	/**
	 * 创建Redis工具类,封装好Redis的连接以进行相关的操作
	 * 
	 * @return
	 */
	@Bean(name = "jedisUtil")
	public JedisUtil createJedisUtil() {
		JedisUtil jedisUtil = new JedisUtil();
		jedisUtil.setJedisPool(jedisWritePool);
		return jedisUtil;
	}

	/**
	 * Redis的key操作
	 * 
	 * @return
	 */
	@Bean(name = "jedisKeys")
	public JedisUtil.Keys createJedisKeys() {
		JedisUtil.Keys jedisKeys = jedisUtil.new Keys();
		return jedisKeys;
	}

	/**
	 * Redis的Strings操作
	 * 
	 * @return
	 */
	@Bean(name = "jedisStrings")
	public JedisUtil.Strings createJedisStrings() {
		JedisUtil.Strings jedisStrings = jedisUtil.new Strings();
		return jedisStrings;
	}
}


0
4
翔仔
回复
qq_淡定_49
晕了,我以为同学说Value,如果是Autowired,得看看同学的,JedisUtil.Strings jedisStrings 里面的jedisStrings这个bean是否已经定义了。。 beanDefinition。。 类似你想用某个service的话,是需要给对应的service实现类标记为@Autowired的。而且同学直接跟视频一样,使用JedisUtil就好了呀
2020-05-10
共4条回复

qq_淡定_49

提问者

2019-11-26

老师,我用的是springboot写的,我看配置文件RedisConfiguration并没有扫描package,我的理解是@Configuration就会自动注入spring容器,那么在util 文件类下使用

@Autowired private 

JedisUtil.Keys jedisKeys;

应该能获取到才对,这让我感觉困惑,如果像老师说的package没扫描到,那我应该怎么做才能获取到,当然我目前解决方法是在servcie把jedisKeys当参数传过来使用,我想了解原理,请老师再解答下。

0
0

翔仔

2019-11-26

同学好,主要看你的对应的package是否被扫描到了,没扫描到的话不会注入呢

0
0

Java双版本(SSM到SpringBoot)校园商铺全栈开发

SSM商铺V1.0,解决毕设痛点;SpringBoot商铺V2.0,满足工作刚需

5113 学习 · 8144 问题

查看课程