springboot配置redis的2种基本⽅式
在搭建基于IDEA的springboot+Redis环境时,深⼊了解springboot框架的相关机制,了解何时⽤配置⽂件,何时利⽤注解,尽可能清晰、完备的总结相关核⼼问题。
话不多少,进⼊主题。
1、搭建springboot+redis的⽅式有两种,它们分别如下:
⽅式⼀:基于RedisTemplate类,redisTemplate是springdate提供的管理redis的⼯具,springboot可以直接注⼊。
需要安装依赖:
<!-- springboot整合redis -->
现在完成时练习题及答案<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
⽅式⼆:基于jedis ,Jedis是Redis官⽅推荐的⾯向Java的操作Redis的客户端,jedis不需要注⼊直接调⽤就可以,如果想注⼊到spring中的话,需要创建jedis配置⽂件,配置⽂件的作⽤是在项⽬启动的时候将jedis注⼊,接着我们就可以在其他类中获取到JedisPool类的信息。
需要安装的依赖:
<!-- redis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
本项⽬采⽤的⽅式是基于⽅法⼆,即利于jedis,通过创建jedis配置⽂件的⽅式,注⼊jedisPool类信息。
2、项⽬架构如下所⽰:
3、从项⽬正常启动开始说明各个⽂件的作⽤以及相关配置说明
a》l内容主要是添加redis jar
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- redis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<!-- Log4J -->
<!-- /artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
note是什么意思<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
b》本项⽬还是采⽤的springboot的默认配置⽂件--application.properties,配置⽂件⾥⾯主要配置的是tomcat的端⼝(默认是8080,本项⽬改成9999,如果tomcat的端⼝默认是8080,就不需要增加rver.port的配置了),以及redis的相关配置。
注意:springboot的版本不同,相应redis的配置也不同。redis的pool属性在springboot版本1.4后,该属性就被封装到jedis中了。本项⽬springboot的版本是2.0.4,因此配置如下:
rver.port=9999
#redis
#springboot版本为2.0.2RELEASE中的RedisProperties配置⽂件类,从图中可知pool属性则被封装到了内部静态类Jedis和Lettuce中去了
# 连接池最⼤阻塞等待时间(使⽤负值表⽰没有限制)
# 连接池中的最⼤空闲连接
# 连接池中的最⼩空闲连接
# 连接超时时间(毫秒)
c》jedis的配置类config-->RedisConfig.java
正⾯最开始介绍的,jedis不需要注⼊直接调⽤就可以,如果想注⼊到spring中的话,需要创建jedis配置⽂件,配置⽂件的作⽤是在项⽬启动的时候将jedis注⼊,接着我们就可以在其他类中获取到JedisPool类的信息。
RedisConfig.java内容如下:
fig;
import org.apache.log4j.Logger;
import org.t.properties.ConfigurationProperties;
import t.annotation.Bean;
import t.annotation.PropertySource;
import org.springframework.stereotype.Component;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
*
* @author vic
* @desc redis config bean
*
*/
@Component//spring boot1.5以上版本@ConfigurationProperties取消location注解后的替代⽅案 cannot resolve method location 与@EnableConfigurationProperties是替代关系//没有使⽤@Component或@Confinguration,因此此对象不会注册到Spring容器中,需要@EnableConfigurationProperties
@PropertySource("classpath:application.properties")//使⽤@PropertySource来指定⾃定义的资源⽬录
@ConfigurationProperties(prefix = "dis") //读取application.properties⽂件中以“dis”开头的变量值。
public class RedisConfig {
private static Logger logger = Logger(RedisConfig.class);
private String hostName;
private int port;
//private String password;
private int timeout;
//@Bean //此处注⼊JedisPoolConfig对象没有意义,不需要
public JedisPoolConfig getRedisConfig(){
JedisPoolConfig config = new JedisPoolConfig();
return config;
}
@Bean//@Bean注解将⼀个配置类的⽅法的返回值定义为⼀个bean,注册到spring⾥⾯
public JedisPool getJedisPool(){
JedisPoolConfig config = getRedisConfig();
JedisPool pool = new JedisPool(config,hostName,port);
logger.info("init JredisPool ...");
return pool;
}
public String getHostName() {
return hostName;
}
public void tHostName(String hostName) {
this.hostName = hostName;
}
public int getPort() {
return port;
}
public void tPort(int port) {
this.port = port;
}
public int getTimeout() {
return timeout;
}
public void tTimeout(int timeout) {
this.timeout = timeout;
}
}
⾸先理解
1、这个配置类的⽬的就是往spring⾥⾯注册JedisPool实例,⽅便其他地⽅Autowired JedisPool对象;
2、配置类中⼏个注解的意思:
@ConfigurationProperties:
1、@ConfigurationProperties(prefix = "dis") //读取application.properties⽂件中以“dis”开头的变量值。
2、@ConfigurationProperties和@value都是将外部属性注⼊到对象
3、@ConfigurationProperties很⽅便使⽤。⽐⽤@value注解好吗? 在特定的⽅案中是的,这只是⼀个
选择问题
@PropertySource:
@PropertySource("classpath:application.properties")//使⽤@PropertySource来指定⾃定义的资源⽬录
@Component注解意思:
将类定义为⼀个bean的注解。⽐如 @Component,@Service,@Controller,@Repository
@EnableConfigurationProperties:
1、如果没有 @Component,@Service,@Controller,@Repository这⼏个注解,则可以通过@EnableConfigurationProperties,来定义为bean 。
2、@EnableConfigurationProperties //开启属性注⼊,有此注解就可以通过@autowired注⼊,是配合@ConfigurationProperties使⽤的。如果没有@EnableConfigurationProperties,则使⽤@ConfigurationProperties注解的class上⾯还需要添加@Component(@Component的包装注解,譬如@Configuration、@Service也可以。但本质还是注解@Component)。
3、@EnableAutoConfiguration在Spring boot中是启动⾃动配置的(Auto-configuration tries to be as intelligent as possible and will back-away as you define more of your own configuration.)。
redis配置类中⽬的都是通过@ConfigurationProperties使⽤外部配置填充Bean属性的⼏种⽅法,即通过获取application.properties⾥⾯的变量值来填充配置类中的Bean属性。
具体有如下⼏种⽅式:
重点讲解下⽅式⼆,因为本项⽬⽤的⽅式就是这种,具体讲解如下:
@Component :说明该类是bean
@PropertySource("classpath:application.properties"):指定springboot配置⽂件的路径
@ConfigurationProperties(prefix = "dis") :从springboot默认配置⽂件(application.properties)⽂件中读取变量值,然后赋值给hostname,port,timeout三个变量(当然可以读取更多变量)
//@Bean //此处注⼊JedisPoolConfig对象没有意义,不需要
public JedisPoolConfig getRedisConfig(){
JedisPoolConfig config = new JedisPoolConfig();
return config;
}
@Bean//@Bean注解将⼀个配置类的⽅法的返回值定义为⼀个bean,注册到spring⾥⾯
public JedisPool getJedisPool(){
JedisPoolConfig config = getRedisConfig();
JedisPool pool = new JedisPool(config,hostName,port);
logger.info("init JredisPool ...");
return pool;
}
@Autowired
private JedisPool jedisPool;
但是getRedisConfig⽅法就没必要加上@bean注解,因为后⾯不需要⾃动注⼊这个对象。
d》rvice层 --->RedisService.java和RedisServiceImpl.java
RedisService.java:接⼝类,定义redis的⼀些⽅法
spring_redis.rvice;
import redis.clients.jedis.Jedis;
public interface RedisService {
public Jedis getResource();
public void returnResource(Jedis jedis);
public void t(String key, String value);
public String get(String key);
}
RedisServiceImpl.java:实现类,实现redis的⼀些⽅法
spring_redis.rvice;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
/**
*
* @desc resdis rvice
*
*/
@Service
public class RedisServiceImpl implements RedisService {
muffin
private static Logger logger = Logger(RedisServiceImpl.class);
@Autowired
private JedisPool jedisPool; //jedisPool不属于springboot框架⽀持的redis类,所以需要⾃⾏注⼊到spring中。通过配置类RedisConfig类注⼊的 @Override
public Jedis getResource() {
Resource();
}
@SuppressWarnings("deprecation")
雅思考试时间@Override
public void returnResource(Jedis jedis) {
if(jedis != null){
}
}
@Override
英特英语public void t(String key, String value) {
Jedis jedis=null;
try{
jedis = getResource();
奥巴马访问古巴jedis.t(key, value);
logger.info("Redis t success - " + key + ", value:" + value);
} catch (Exception e) {
e.printStackTrace();
<("Redis t error: "+ e.getMessage() +" - " + key + ", value:" + value);
}finally{
returnResource(jedis);
}
}
@Override
public String get(String key) {
String result = null;
Jedis jedis=null;
try{
jedis = getResource();
result = (key);
logger.info("Redis get success - " + key + ", value:" + result);
} catch (Exception e) {
e.printStackTrace();
<("Redis t error: "+ e.getMessage() +" - " + key + ", value:" + result);
}finally{
returnResource(jedis);
}
witcheryreturn result;
}
}
e》controller--》DemoController.java,能Autowired RedisService的原因是该类上加⼊了@rvice注解,表⽰为bean ller;
del.ResponModal;
spring_redis.rvice.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
6级改革
import org.springframework.web.bind.annotation.RestController;
promod
@RestController
public class DemoController {
@Autowired
private RedisService redisService;
@RequestMapping("/redis/t")
public ResponModal redisSet(@RequestParam("value")String value){
redisService.t("name", value);
return new ResponModal(200, true, "success", null);
}
@RequestMapping("/redis/get")
public ResponModal redisGet(){
String name = ("name");
return new ResponModal(200, true,"success",name);
}
}
f》model 都是与视图相关的数据,定义消息返回格式
Model.java
del;
public class Modal {
public Modal() {
super();
}
public Modal(int code, boolean success, String message) {
super();
this.success = success;
}
private int code;
private boolean success;
英国出国留学费用private String message;
public int getCode() {
return code;
}
public void tCode(int code) {
}
public boolean isSuccess() {
return success;
}
public void tSuccess(boolean success) {