springboot自定义redis

网友投稿 244 2022-11-17


springboot自定义redis

spring时代整合redis

spring我相信只要是一个java开发人员我相信再熟悉不过了,几乎垄断了整个JavaEE的市场份额,话不多说进入正题。

首先看看我们在spring中整合redis需要做什么

1、首先maven工程的话不用想先导入依赖

redis.clients

jedis

2.4.2

org.springframework.data

spring-data-redis

1.4.2.RELEASE

2、在spring-xml中配置

....... 这里省略一些更多配置

4、这样子以后我们就可以在业务层通过 @Autowired 引用redis操作模板了

@Autowired

RedisTemplate redisTemplate;

3、上面就是spring使用redis的大致流程。

这样子看起来也还好啊?

但是每个项目都要去经过这么一系列繁琐的xml配置,这就是重复工作了。这时候就出现了“springboot” 就是专门去做这些整合的事情了,让我们不需要整合这些只需几行基础配置即可。

springboot 实现自动装配redis

在开始spring boot之前我们首先要来看几个注解,spring boot实现自定义装配的核心就是这几个注解:

1、@Import:Import注解的主要的作用是将bean导入到spring容器中,比如说要自定义一些bean交spring容器托管,这是我们就可以建一个配置类使用import注解专门去导入你自定义的一些bean到spring容器中。

2、@Bean:Bean注解告诉Spring这个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的bean。通常方法体中包含了最终产生bean实例的逻辑。

3、@Component:通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中。

4、@Configuration:来声明一个spring的配置类等同于spring中的xml文件,ConfigurationClassPostProcessor::enhanceConfigurationClasses这个方法是Configuration注解工作的核心方法,spring应用启动时所有的被@Configuration注解的类都会被spring cglib库生成cglib动态代理,然后其他地方通过@Autowired注解引入Student类对象就会被生成的configuration配置类生成的动态代理拦截,处理完后再调用原configuration注解类的student方法获取到Student实例。

5、@Conditiona:个人感觉主要是做一些判断条件的、只有当condition的machet匹配方法为 true 的时候【该方法内也是我们实现一些自定义逻辑判断的扩展点】,才会去加载该bean 否则不加载该bean。

----- condition又繁衍出很多子类(方便我们直接使用)

@ConditionalOnMissingBean:当容器下有当前这个bean就不加载没有则加载

@ConditionalOnExpression:当括号中的内容为true时,使用该注解的类被实例化。

示例:

@ConditionalOnExpression("KaTeX parse error: Expected 'EOF', got '&' at position 25: …mer.enabled}==1&̲&{rabbitmq.comsumer.enabled:true}")

@ConditionalOnExpression("'${mq.comsumer}'.equals(‘rabbitmq')")

@ConditionalOnClass:当classpath下有某个class的时候,就执行下面操作

@ConditionalOnBean:只有当给定的bean存在时、则实例化当前bean。

1、新建两个项目:一个autoconfig一个starter项目

注:【maven项目即可】。

starter:主要是做让其他项目依赖的start。

autoconfig:实现具体自动装配逻辑处理。

2、添加 autoconfig 项目中的pom文件如下:

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

org.xing.modules

spring-boot-redis-autoconfig

1.0.0

1.8

UTF-8

UTF-8

2.9.0

2.1.4.RELEASE

org.springframework.boot

spring-boot-starter

${springboot.version}

org.springframework.data

spring-data-redis

${springboot.version}

redis.clients

jedis

${jedis.version}

org.springframework.boot

spring-boot-autoconfigure-processor

${springboot.version}

true

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

org.xing.modules

spring-boot-redis-autoconfig

1.0.0

1.8

UTF-8

UTF-8

2.9.0

2.1.4.RELEASE

org.springframework.boot

spring-boot-starter

${springboot.version}

org.springframework.data

spring-data-redis

${springboot.version}

redis.clients

jedis

${jedis.version}

org.springframework.boot

spring-boot-autoconfigure-processor

${springboot.version}

true

3、starter 项目中pom 只需添加autoconfig依赖即可。

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

org.xing.modules

spring-boot-redis-starter

1.0.0

1.8

UTF-8

UTF-8

org.xing.modules

spring-boot-redis-autoconfig

1.0.0

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

org.xing.modules

spring-boot-redis-starter

1.0.0

1.8

UTF-8

UTF-8

org.xing.modules

spring-boot-redis-autoconfig

1.0.0

4、autoconfig项目中创建一个包configuration、再创建一个RedisConfiguration类。

package org.xing.modules.configuration;

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;

import org.springframework.data.redis.core.RedisOperations;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisPool;

import redis.clients.jedis.JedisPoolConfig;

import java.net.ConnectException;

/**

* {@like @ConditionalOnClass:

* This annotation indicates that there must be RedisOperations in the current classpath to inject this Bean}

*

* @ConditionalOnClass(Jedis.class)

* 此注解表示当前ClassPath必须包含有Jedis这个类才会入这个配置类到spring容器中

* 意思就是项目当中存在了jedis客户端依赖才觉得你需要使用,否则就没必要去注入.

*

* @author Created by John on 2020/10/12

*/

@Configuration

@ConditionalOnClass(Jedis.class)

public class RedisConfiguration {

// 加载配置文件信息 这里使用properties类去做配置加载。

// @src = org.xing.modules.configuration.RedisProperties

【**如下步骤 跟 spring 配置流程雷同**】

/**

*

*

*

*

*

*/

@Bean

public JedisPool jedisPool(RedisProperties redisProperties) throws ConnectException {

JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();

jedisPoolConfig.setMinIdle(redisProperties.getMinIdle());

jedisPoolConfig.setMaxIdle(redisProperties.getMaxIdle());

jedisPoolConfig.setMaxWaitMillis(redisProperties.getMaxWait());

jedisPoolConfig.setMaxTotal(redisProperties.getMaxActive());

String password = isBlank(redisProperties.getPassword()) ? null:redisProperties.getPassword();

return new JedisPool(jedisPoolConfig,redisProperties.getHost(),redisProperties.getPort(),redisProperties.getTimeout(),password);

}

/**

*

*

*

*

*

*

*

*

*

*

*/

@Bean

public JedisConnectionFactory redisConnectionFactory(RedisProperties redisProperties) {

JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();

jedisConnectionFactory.setHostName(redisProperties.getHost());

jedisConnectionFactory.setPort(redisProperties.getPort());

jedisConnectionFactory.setPassword(redisProperties.getPassword());

jedisConnectionFactory.setDatabase(redisProperties.getDatabase());

return jedisConnectionFactory;

}

// 第三步抽离出:@src = org.xing.modules.template.RedisTemplateConfiguration

/**

*

*

*

*

*

*

*

*

*

*

*

*/

public static boolean isBlank(String str) {

return str == null || "".equals(str.trim());

}

}

5、创建properties配置文件加载类

package org.xing.modules.configuration;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springfrQSmmPkzUGaamework.stereotype.Component;

/**

* @author Created by mr_zhou on 2020/10/12

*

* @TODO: "my.springboot.redis" Qualified redis configuration must begin with this prefix

* 限定使用此starter的redis配置必须以“my.springboot.redis.”为前缀

* 示例:

* my.springboot.redis.host

* my.springboot.redis.prot

*/

@Component

@ConfigurationProperties(prefix = "my.springboot.redis")

public class RedisProperties {

private int port;

private String host;

private String password;

private int timeout;

private int database;

@Value("${redis.pool.max-active}")

private int maxActive;

@Value("${redis.pool.max-wait}")

private int maxWait;

@Value("${redis.pool.max-idle}")

private int maxIdle;

@Value("${redis.pool.min-idle}")

private int minIdle;

// 省略 get/set方法

6、创建redis操作模板类

这里其实也可以 RedisConfiguration 类中注入到spring容器中,但是为了职责划分就单独使用。

package org.xing.modules.template;

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;

import org.springframework.data.redis.core.RedisTemplate;

/**

* TODO: Redis Template Configuration Class

*

* @author Created by mr_zhou on 2020/10/12

*/

@Configuration

public class RedisTemplateConfiguration {

@Bean

@ConditionalOnMissingBean

public RedisTemplate redisTemplate(JedisConnectionFactory jedisConnectionFactory){

RedisTemplate redisTemplate = new RedisTemplate();

redisTemplate.setConnectionFactory(jedisConnectionFactory);

return redisTemplate;

}

// 更多模板注入.....

}

7、Redis对外出口配置类

该类主要作用于spring容器加载入口

package org.xing.modules.template;

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;

import org.springframework.data.redis.core.RedisTemplate;

/**

* TODO: Redis Template Configuration Class

*

* @author Created by mr_zhou on 2020/10/12

*/

@Configuration

public class RedisTemplateConfiguration {

@Bean

@ConditionalOnMissingBean

public RedisTemplate redisTemplate(JedisConnectionFactory jedisConnectionFactory){

RedisTemplate redisTemplate = new RedisTemplate();

redisTemplate.setConnectionFactory(jedisConnectionFactory);

return redisTemplate;

}

// 更多模板注入.....

}

8、springboot优雅扩展的入口

我们打开springboot自动配置jar里面的源码:

springboot自动装配主要是扫描

【META-INF 下的 spring.factories 文件下 # Auto Configure】下的所有类

因此我们照葫芦画瓢【在starter下创建META-INF 再创建spring.factories】

让后在maven里面先后 autoconfig -> starter install一下。

9、demo使用自定义starter

1、在demo项目中加入自定义starter的依赖

2、最后就可以直接在项目中注入使用redis。

【pom里面可以看到我们没有加任何redis依赖的只加了自定义的starter】

/**

* @author Created by mr_zhou on 2020/10/12

*/

public class MyService {

@Autowired

private RedisTemplate redisTemplate;

}

3、配置redis连接信息即可操作 - 对应 RedisProperties 属性。

10、全剧终

最后我们就可以慢慢完善自己的starter做到以后直接使用自己的redis封装一些常用的操作。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:基于request获取访问者真实IP代码示例
下一篇:详解JVM的分代模型
相关文章

 发表评论

暂时没有评论,来抢沙发吧~