springboot 사용자 정의 redis-starter 구현

봄 시대 통합 redis
spring 저 는 자바 개발 자 라면 더 이상 익숙 할 수 없다 고 믿 습 니 다.거의 전체 자바 의 시장 점유 율 을 독점 하고 더 이상 말 하지 않 고 본론 으로 들 어 갑 니 다.
일단 저희 가 spring 에서 redis 를 통합 해서 뭘 해 야 되 는 지.
1.우선 Maven 프로젝트 는 의존 도 를 가 져 올 생각 이 없습니다.

<!-- jedis -->
  <dependency>
   <groupId>redis.clients</groupId>
   <artifactId>jedis</artifactId>
   <version>2.4.2</version>
  </dependency>
<!-- 2、spring  Redis jar  -->
  <dependency>
   <groupId>org.springframework.data</groupId>
   <artifactId>spring-data-redis</artifactId>
   <version>1.4.2.RELEASE</version>
  </dependency>
2.spring-xml 에서 설정

<!-- 1、  jedis      -->
  <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <!--      -->
    <property name="maxTotal" value="50"></property>
    <property name="maxIdle" value="5"></property>
   	.......           
  </bean>
  
  <!--2、      JedisConnectionFactory-->
  <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    <!--               -->
    <!--       -->
    <property name="hostName" value="127.0.0.1"></property>
    <!--       -->
    <property name="port" value="6379"></property>
    <!--    -->
    <property name="password" value="yichun"></property>
    <!--      :                                  -->
    <property name="poolConfig" ref="jedisPoolConfig"></property>
  </bean>
  
	<!--  3、  RedisTemplate                JedisConnectionFactory       RedisTemplate   -->
  <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
    <property name="connectionFactory" ref="jedisConnectionFactory"></property>
 
  	  <!--     key value      ,     -->
    <property name="keySerializer">
      <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean>
    </property>
    <property name="valueSerializer">
      <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean>
    </property>
  </bean>

	4、                 @Autowired   redis     
	 @Autowired
   RedisTemplate<String,String> redisTemplate;
3.위 는 spring 이 redis 를 사용 하 는 대체적인 절차 입 니 다.
이렇게 해도 괜 찮 은 데?
그러나 모든 항목 은 이러한 번 거 로 운 xml 설정 을 거 쳐 야 한다.이것 이 바로 중복 작업 이다.이때'spring boot'는 바로 이러한 통합 을 전문 적 으로 하 는 일 입 니 다.우 리 는 이러한 통합 을 필요 로 하지 않 고 몇 줄 의 기초 설정 만 하면 됩 니 다.
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.@Condition a:개인 적 으로 판단 조건 을 하 는 것 같 습 니 다.condition 의 machet 일치 방법 이 true 일 때 만[이 방법 에서 도 우리 가 사용자 정의 논리 적 판단 을 실현 하 는 확장 점]이 bean 을 불 러 올 수 있 습 니 다.그렇지 않 으 면 이 bean 을 불 러 오지 않 습 니 다.
--condition 은 또 많은 하위 클래스 를 번식 시킨다(우리 가 직접 사용 하기에 편리 함)
@conditional OnMissingBean:용기 밑 에 현재 이 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')")
@conditional OnClass:classpath 에 어떤 class 가 있 을 때 다음 작업 을 수행 합 니 다.
@conditionalOnBean:주어진 bean 이 존재 할 때 만 현재 bean 을 예화 합 니 다.
1.새 두 항목:autoconfig 하나 starter 프로젝트
주:[maven 프로젝트 면 됩 니 다].
starter:주로 다른 프로젝트 에 의존 하 는 start 를 합 니 다.
autoconfig:구체 적 인 자동 조립 논리 처 리 를 실현 합 니 다.
在这里插入图片描述
2.autoconfig 프로젝트 의 pom 파일 을 다음 과 같이 추가 합 니 다.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.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">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.xing.modules</groupId>
  <artifactId>spring-boot-redis-autoconfig</artifactId>
  <version>1.0.0</version>

  <properties>
    <!-- Environment Settings -->
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

    <jedis.version>2.9.0</jedis.version>
    <springboot.version>2.1.4.RELEASE</springboot.version>
  </properties>

  <dependencies>
    <!-- springboot-stater -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>${springboot.version}</version>
    </dependency>

    <!-- spring-data-redis -->
    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-redis</artifactId>
      <version>${springboot.version}</version>
    </dependency>

    <!-- Jedis -->
    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>${jedis.version}</version>
    </dependency>

	
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-autoconfigure-processor</artifactId>
      <version>${springboot.version}</version>
      <optional>true</optional>
    </dependency>
  </dependencies>
</project>
3.starter 프로젝트 에서 pom 은 autoconfig 의존 도 를 추가 하면 됩 니 다.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.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">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.xing.modules</groupId>
  <artifactId>spring-boot-redis-starter</artifactId>
  <version>1.0.0</version>

  <properties>
    <!-- Environment Settings -->
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.xing.modules</groupId>
      <artifactId>spring-boot-redis-autoconfig</artifactId>
      <version>1.0.0</version>
    </dependency>
  </dependencies>
</project>
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       **】
  /**
   *	  <!-- 1、  jedis      -->
   *   <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
   *     <property name="maxTotal" value="50"></property>
   *     <property name="maxIdle" value="5"></property>
   *   </bean>
   */
  @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);
  }

  /**   <!--2、      JedisConnectionFactory-->
   *   <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
   *     <!--       -->
   *     <property name="hostName" value="127.0.0.1"></property>
   *     <!--       -->
   *     <property name="port" value="6379"></property>
   *     <!--    -->
   *     <property name="password" value="yichun"></property>
   *     <!--      :                                  -->
   *     <property name="poolConfig" ref="jedisPoolConfig"></property>
   *   </bean>
   */
  @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
  /** 	<!--  3、  RedisTemplate                JedisConnectionFactory       RedisTemplate   -->
   *   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
   *     <property name="connectionFactory" ref="jedisConnectionFactory"></property>
   *
   *  	  <!--     key value      ,     -->
   *     <property name="keySerializer">
   *       <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean>
   *     </property>
   *     <property name="valueSerializer">
   *       <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean>
   *     </property>
   *   </bean>
   */


  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.springframework.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 에 서 는 리 디 스 의존 없 이 사용자 정의 starter 만 추가 한 것 을 볼 수 있 습 니 다.]

/**
 * @author Created by mr_zhou on 2020/10/12
 */
public class MyService {

  @Autowired
  private RedisTemplate redisTemplate;

}
3.redis 연결 정 보 를 설정 하면 조작 할 수 있 습 니 다.-RedisProperties 속성 에 대응 합 니 다.
在这里插入图片描述
10.드라마 종영
마지막 으로 우 리 는 자신의 starter 를 천천히 보완 할 수 있다.
springboot 사용자 정의 redis-starter 의 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 springboot 사용자 정의 redis-starter 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기