最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot自定義redis-starter的實現(xiàn)

 更新時間:2020年10月15日 15:20:05   作者:zhouhouxing  
這篇文章主要介紹了springboot自定義redis-starter的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

spring時代整合redis

spring我相信只要是一個Java開發(fā)人員我相信再熟悉不過了,幾乎壟斷了整個JavaEE的市場份額,話不多說進入正題。

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

1、首先maven工程的話不用想先導(dǎo)入依賴

<!-- 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">
    <!-- 最大連接數(shù)-->
    <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">
    <!--需要自定義一些工廠屬性配置信息-->
    <!-- 服務(wù)器地址 -->
    <property name="hostName" value="127.0.0.1"></property>
    <!-- 服務(wù)端口號 -->
    <property name="port" value="6379"></property>
    <!-- 密碼 -->
    <property name="password" value="yichun"></property>
    <!-- 連接池配置:再把第一步配置好的連接池信息通過屬性注入進來 否則會采用默認(rèn)的連接池-->
    <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、這樣子以后我們就可以在業(yè)務(wù)層通過 @Autowired 引用redis操作模板了
	 @Autowired
   RedisTemplate<String,String> redisTemplate;

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

這樣子看起來也還好???
但是每個項目都要去經(jīng)過這么一系列繁瑣的xml配置,這就是重復(fù)工作了。這時候就出現(xiàn)了“springboot” 就是專門去做這些整合的事情了,讓我們不需要整合這些只需幾行基礎(chǔ)配置即可。

springboot 實現(xiàn)自動裝配redis

在開始spring boot之前我們首先要來看幾個注解,spring boot實現(xiàn)自定義裝配的核心就是這幾個注解:

1、@Import:Import注解的主要的作用是將bean導(dǎo)入到spring容器中,比如說要自定義一些bean交spring容器托管,這是我們就可以建一個配置類使用import注解專門去導(dǎo)入你自定義的一些bean到spring容器中。

2、@Bean:Bean注解告訴Spring這個方法將會返回一個對象,這個對象要注冊為Spring應(yīng)用上下文中的bean。通常方法體中包含了最終產(chǎn)生bean實例的邏輯。

3、@Component:通常是通過類路徑掃描來自動偵測以及自動裝配到Spring容器中。

4、@Configuration:來聲明一個spring的配置類等同于spring中的xml文件,ConfigurationClassPostProcessor::enhanceConfigurationClasses這個方法是Configuration注解工作的核心方法,spring應(yīng)用啟動時所有的被@Configuration注解的類都會被spring cglib庫生成cglib動態(tài)代理,然后其他地方通過@Autowired注解引入Student類對象就會被生成的configuration配置類生成的動態(tài)代理攔截,處理完后再調(diào)用原configuration注解類的student方法獲取到Student實例。

5、@Conditiona:個人感覺主要是做一些判斷條件的、只有當(dāng)condition的machet匹配方法為 true 的時候【該方法內(nèi)也是我們實現(xiàn)一些自定義邏輯判斷的擴展點】,才會去加載該bean 否則不加載該bean。
----- condition又繁衍出很多子類(方便我們直接使用)
@ConditionalOnMissingBean:當(dāng)容器下有當(dāng)前這個bean就不加載沒有則加載

@ConditionalOnExpression:當(dāng)括號中的內(nèi)容為true時,使用該注解的類被實例化。
示例:
@ConditionalOnExpression("KaTeX parse error: Expected 'EOF', got '&' at position 25: …mer.enabled}==1&̲&{rabbitmq.comsumer.enabled:true}")
@ConditionalOnExpression("'${mq.comsumer}'.equals(‘rabbitmq')")

@ConditionalOnClass:當(dāng)classpath下有某個class的時候,就執(zhí)行下面操作

@ConditionalOnBean:只有當(dāng)給定的bean存在時、則實例化當(dāng)前bean。

1、新建兩個項目:一個autoconfig一個starter項目

注:【maven項目即可】。
starter:主要是做讓其他項目依賴的start。
autoconfig:實現(xiàn)具體自動裝配邏輯處理。

在這里插入圖片描述

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項目中創(chuàng)建一個包configuration、再創(chuàng)建一個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)
 * 此注解表示當(dāng)前ClassPath必須包含有Jedis這個類才會入這個配置類到spring容器中
 * 意思就是項目當(dāng)中存在了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">
   *     <!-- 服務(wù)器地址 -->
   *     <property name="hostName" value="127.0.0.1"></property>
   *     <!-- 服務(wù)端口號 -->
   *     <property name="port" value="6379"></property>
   *     <!-- 密碼 -->
   *     <property name="password" value="yichun"></property>
   *     <!-- 連接池配置:再把第一步配置好的連接池信息通過屬性注入進來 否則會采用默認(rèn)的連接池-->
   *     <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、創(chuàng)建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、創(chuàng)建redis操作模板類

這里其實也可以 RedisConfiguration 類中注入到spring容器中,但是為了職責(zé)劃分就單獨使用。

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優(yōu)雅擴展的入口

我們打開springboot自動配置jar里面的源碼:
springboot自動裝配主要是掃描
【META-INF 下的 spring.factories 文件下 # Auto Configure】下的所有類

在這里插入圖片描述

因此我們照葫蘆畫瓢【在starter下創(chuàng)建META-INF 再創(chuàng)建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連接信息即可操作 - 對應(yīng) RedisProperties 屬性。

在這里插入圖片描述

10、全劇終

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

到此這篇關(guān)于springboot自定義redis-starter的實現(xiàn)的文章就介紹到這了,更多相關(guān)springboot自定義redis-starter內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談java內(nèi)存管理與內(nèi)存溢出異常

    淺談java內(nèi)存管理與內(nèi)存溢出異常

    下面小編就為大家?guī)硪黄獪\談java內(nèi)存管理與內(nèi)存溢出異常。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • springboot啟動時候報錯mongodb問題

    springboot啟動時候報錯mongodb問題

    這篇文章主要介紹了springboot啟動時候報錯mongodb問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • JNDI在JavaEE中的角色_動力節(jié)點Java學(xué)院整理

    JNDI在JavaEE中的角色_動力節(jié)點Java學(xué)院整理

    這篇文章主要介紹了JNDI在JavaEE中的角色,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 使用java判斷101-200之間有多少個素數(shù)并輸出

    使用java判斷101-200之間有多少個素數(shù)并輸出

    在編程中,處理數(shù)學(xué)問題是一個常見的任務(wù),本文將介紹如何使用Java語言來判斷101到200之間的整數(shù)中有多少個是素數(shù),并輸出這些素數(shù),需要的小伙伴可以了解下
    2026-01-01
  • Java開發(fā)必備的三大修飾符

    Java開發(fā)必備的三大修飾符

    JAVA的三個修飾:static,final,abstract,在JAVA語言里無處不在,但是它們都能修飾什么組件,修飾組件的含義又有什么限制,總是混淆.所以來總結(jié)一下,需要的朋友可以參考下
    2021-06-06
  • JavaWeb如何實現(xiàn)禁用瀏覽器緩存

    JavaWeb如何實現(xiàn)禁用瀏覽器緩存

    這篇文章主要介紹了JavaWeb如何實現(xiàn)禁用瀏覽器緩存,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • JAVA中SSM框架的搭建實現(xiàn)CRUD的方法

    JAVA中SSM框架的搭建實現(xiàn)CRUD的方法

    這篇文章主要介紹了JAVA中SSM框架的搭建實現(xiàn)CRUD的方法,小編把運行代碼列了出來,供大家參考。
    2017-11-11
  • SpringBoot整合Thymeleaf與FreeMarker視圖層技術(shù)

    SpringBoot整合Thymeleaf與FreeMarker視圖層技術(shù)

    在目前的企業(yè)級應(yīng)用開發(fā)中,前后端分離是趨勢,但是視圖層技術(shù)還占有一席之地。Spring Boot 對視圖層技術(shù)提供了很好的支持,福安防推薦使用的模板引擎是Thymeleaf,不過想FreeMarker也支持,JSP技術(shù)在這里并不推薦使用
    2022-08-08
  • SpringBoot多種生產(chǎn)打包方式詳解

    SpringBoot多種生產(chǎn)打包方式詳解

    生產(chǎn)上發(fā)布?Spring?Boot?項目時,流程頗為繁瑣且低效,但凡代碼有一丁點改動,就得把整個項目重新打包部署,耗時費力不說,生成的?JAR?包還特別臃腫,體積龐大,本文給大家介紹了SpringBoot多種生產(chǎn)打包方式,需要的朋友可以參考下
    2025-01-01
  • JAVA版排序算法之快速排序示例

    JAVA版排序算法之快速排序示例

    這篇文章主要介紹了JAVA版排序算法之快速排序,結(jié)合實例形式分析了基于java版的遍歷、遞歸實現(xiàn)快速排序功能的具體步驟與操作技巧,需要的朋友可以參考下
    2017-01-01

最新評論

桓台县| 张家川| 娱乐| 安顺市| 西丰县| 绵竹市| 长阳| 临颍县| 若尔盖县| 乳源| 北辰区| 普兰店市| 瑞昌市| 兴国县| 惠水县| 福泉市| 兴义市| 永兴县| 郓城县| 自贡市| 湛江市| 武夷山市| 万安县| 泗洪县| 安泽县| 探索| 正安县| 阳山县| 保山市| 濮阳市| 德化县| 平乡县| 正宁县| 梧州市| 温州市| 贵德县| 邵阳县| 祁阳县| 平乡县| 长武县| 方正县|