亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

我們知道SpringBoot Starter也就是啟動(dòng)器。是SpringBoot組件化的一大優(yōu)點(diǎn)。基于這個(gè)思想,基于這個(gè)思想SpringBoot 才變得非常強(qiáng)大,官方給我們提供很多開箱即用的啟動(dòng)器。

Spring Boot Starter 是 Spring Boot 的一個(gè)重要特性,它有以下優(yōu)點(diǎn):

  1. 依賴管理:Starter 自動(dòng)處理項(xiàng)目的依賴關(guān)系,使得開發(fā)者無需手動(dòng)添加和管理每個(gè)依賴。
  2. 自動(dòng)配置:Starter 提供了一種自動(dòng)配置的方式,可以根據(jù)你的 classpath 和你定義的屬性自動(dòng)配置 Spring 應(yīng)用。
  3. 簡(jiǎn)化開發(fā):通過提供各種服務(wù)的 Starter(如數(shù)據(jù)庫、安全、緩存等),極大地簡(jiǎn)化了開發(fā)過程。
  4. 減少樣板代碼:由于 Starter 的自動(dòng)配置和依賴管理,開發(fā)者可以專注于業(yè)務(wù)邏輯,而不是配置和基礎(chǔ)設(shè)施代碼。
  5. 快速原型開發(fā):使用 Starter 可以快速創(chuàng)建可運(yùn)行的原型。
  6. 易于理解和使用:Spring Boot Starter 的設(shè)計(jì)目標(biāo)之一就是讓非專業(yè)的開發(fā)者也能快速上手。
  7. 社區(qū)支持:除了官方提供的 Starter,還有大量的社區(qū)提供的 Starter,可以滿足各種特定需求。

我現(xiàn)在手把手教大家如何封裝自己的starter 做自己的springboot組件,當(dāng)然你也可以發(fā)布自己的starter 到maven中央倉庫供大家使用

剖析SpringBoot自帶Starter

我們以WebMvcAutoConfiguration這個(gè)自動(dòng)加載為例

自動(dòng)配置類要能加載,有一個(gè)要求,源碼分析結(jié)果是,需要在META-INFspring.factories中做如下配置

JAVA復(fù)制代碼# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,

這樣SpringBoot在啟動(dòng)完成時(shí)候,會(huì)找到我們引入,的starter 找到META-INFspring.factories 屬性文件,找到需要自動(dòng)加載配置的類路徑,然后幫我們自動(dòng)注入到Spring IOC 容器,我們?cè)陧?xiàng)目中就可以直接使用了。

這里實(shí)現(xiàn)自動(dòng)加載還要依賴一些注解如:

js復(fù)制代碼@Configuration // 指定這個(gè)類是個(gè)配置類
@ConditionalOnXXX // 在指定條件成立的情況下自動(dòng)配置類生效
@AutoConfigureOrder //配置類順序
@AutoConfigureAfter // 在哪個(gè)配置類之后
@Bean //給容器中添加組件

@ConfigurationProperties //結(jié)合相關(guān)的XXXProperties類 來綁定相關(guān)的配置
@EnableConfigurationProperties // 讓XXXProperties加入到容器中,別人就可以自動(dòng)裝配

自定義自己的starter

剖析了SpringBoot 官方的starter 我們自定義自己的starter,(我們仿照著寫)

命名規(guī)范

 

配置提示

如果自定義屬性文件中,需要IDEA智能提示需要引入

pom復(fù)制代碼       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

定義starter

這里我以自己封裝總結(jié)我工作以來總結(jié)項(xiàng)目封裝的一個(gè)SpringBoot starter為例

java復(fù)制代碼 <dependency>
            <groupId>cn.soboys</groupId>
            <artifactId>rest-api-spring-boot-starter</artifactId>
            <version>1.2.0</version>
        </dependency>

就是我自己封裝的start。已經(jīng)發(fā)布中央倉庫。

目前更新版本1.3.0 功能如下

  1. 支持一鍵配置自定義RestFull API 統(tǒng)一格式返回
  2. 支持RestFull API 錯(cuò)誤國(guó)際化
  3. 支持全局異常處理,全局參數(shù)驗(yàn)證處理
  4. 業(yè)務(wù)錯(cuò)誤斷言工具封裝,遵循錯(cuò)誤優(yōu)先返回原則
  5. redis工作封裝。支持所有key操作工具
  6. RestTemplate 封裝 POST,GET 請(qǐng)求工具
  7. 日志集成。自定義日志路徑,按照日志等級(jí)分類,支持壓縮和文件大小分割。按時(shí)間顯示
  8. 工具庫集成 集成了lombok,hutool,commons-lang3,guava。不需要自己?jiǎn)蝹€(gè)引入
  9. 集成MyBatisPlus一鍵代碼生成


rest-api-spring-boot-starter 倉庫地址 Github

  1. 自定義配置屬性文件
yml復(fù)制代碼rest-api:
  enabled: false
  logging:
    path: ./logs
  i18n:
    # 若前端無header傳參則返回中文信息
    i18n-header: Lang
    default-lang: cn
    message:
      # admin
      internal_server_error:
        en: Internal Server Error
        cn: 系統(tǒng)錯(cuò)誤
      not_found:
        en: Not Found
        cn: 請(qǐng)求資源不存在

  1. 定義屬性配置類
java復(fù)制代碼package cn.soboys.restapispringbootstarter.i18n;


import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;


import java.util.Map;
import java.util.Optional;

/**
 * @author 公眾號(hào) 程序員三時(shí)
 * @version 1.0
 * @date 2023/6/26 11:55
 * @webSite https://github.com/coder-amiao
 */
//@PropertySource(value = "classpath:i18n.yaml", factory = YamlPropertySourceFactory.class)
@Configuration
@ConfigurationProperties(prefix = "rest-api.i18n")
@Data
public class I18NMessage {
    /**
     * message-key:<lang:message>
     */
    private Map<String, Map<String, String>> message;
    /**
     * Default language setting (Default "cn").
     */
    private String defaultLang = "cn";


    private String i18nHeader = "Lang";


    /**
     * get i18n message
     *
     * @param key
     * @param language
     * @return
     */
    public String message(I18NKey key, String language) {
        return Optional.ofNullable(message.get(key.key()))
                .map(map -> map.get(language == null ? defaultLang : language))
                .orElse(key.key());
    }

    /**
     * get i18n message
     *
     * @param key
     * @param language
     * @return
     */
    public String message(String key, String language) {
        return Optional.ofNullable(message.get(key))
                .map(map -> map.get(language == null ? defaultLang : language))
                .orElse(key);
    }

}

  1. 定義BeanAutoConfiguration自動(dòng)加載配置類
java復(fù)制代碼package cn.soboys.restapispringbootstarter.config;

import cn.soboys.restapispringbootstarter.ApplicationRunner;
import cn.soboys.restapispringbootstarter.ExceptionHandler;
import cn.soboys.restapispringbootstarter.ResultHandler;
import cn.soboys.restapispringbootstarter.aop.LimitAspect;
import cn.soboys.restapispringbootstarter.i18n.I18NMessage;
import cn.soboys.restapispringbootstarter.utils.RedisTempUtil;
import cn.soboys.restapispringbootstarter.utils.RestFulTemp;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter;
import org.springframework.web.client.RestTemplate;

import java.nio.charset.Charset;
import java.util.List;

/**
 * @author 公眾號(hào) 程序員三時(shí)
 * @version 1.0
 * @date 2023/6/27 11:36
 * @webSite https://github.com/coder-amiao
 */
@Configuration
@ConditionalOnProperty(name = "rest-api.enabled", havingValue = "true")
public class BeanAutoConfiguration {


    @Bean
    public I18NMessage i18NMessage() {
        return new I18NMessage();
    }

    @Bean
    public ResultHandler resultHandler() {
        return new ResultHandler();
    }

    @Bean
    public ExceptionHandler exceptionHandler() {
        return new ExceptionHandler();
    }

    @Bean
    public StartupApplicationListener startupApplicationListener() {
        return new StartupApplicationListener();
    }


    @Bean
    public RestApiProperties restApiProperties() {
        return new RestApiProperties();
    }

    @Bean
    public RestApiProperties.LoggingProperties loggingProperties(RestApiProperties restApiProperties) {
        return restApiProperties.new LoggingProperties();
    }

    @Bean
    public ApplicationRunner applicationRunner() {
        return new ApplicationRunner();
    }




    /**
     * restTemplate 自動(dòng)注入
     */
    @Configuration
    @ConditionalOnProperty(name = "rest-api.enabled", havingValue = "true")
    class RestTemplateConfig {
        /**
         * 第三方請(qǐng)求要求的默認(rèn)編碼
         */
        private final Charset thirdRequest = Charset.forName("utf-8");

        @Bean
        public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
            RestTemplate restTemplate = new RestTemplate(factory);
            // 處理請(qǐng)求中文亂碼問題
            List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();
            for (HttpMessageConverter<?> messageConverter : messageConverters) {
                if (messageConverter instanceof StringHttpMessageConverter) {
                    ((StringHttpMessageConverter) messageConverter).setDefaultCharset(thirdRequest);
                }
                if (messageConverter instanceof MappingJackson2HttpMessageConverter) {
                    ((MappingJackson2HttpMessageConverter) messageConverter).setDefaultCharset(thirdRequest);
                }
                if (messageConverter instanceof AllEncompassingFormHttpMessageConverter) {
                    ((AllEncompassingFormHttpMessageConverter) messageConverter).setCharset(thirdRequest);
                }
            }
            return restTemplate;
        }

        @Bean
        public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
            SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
            factory.setConnectTimeout(15000);
            factory.setReadTimeout(5000);
            return factory;
        }


        @Bean
        public RestFulTemp restFulTemp() {
            return new RestFulTemp();
        }

    }

}
  1. 自動(dòng)裝配 在項(xiàng)目

 

spring.factories 配置自己加載配置類

xml復(fù)制代碼org.springframework.boot.autoconfigure.EnableAutoConfiguration=
cn.soboys.restapispringbootstarter.config.BeanAutoConfiguration,
cn.soboys.restapispringbootstarter.config.BeanAutoConfiguration.RestTemplateConfig,
cn.soboys.restapispringbootstarter.utils.RedisTempUtil

擴(kuò)展思考,我們可以看到SpringBoot官方stater 很多啟用都類似@Enablexxx注解 這個(gè)怎么實(shí)現(xiàn)。我的
rest-api-spring-boot-starter 1.3.0已經(jīng)實(shí)現(xiàn)不需要在application.properties配置一行 直接在啟動(dòng)類或者配置類使用EnableRestFullApi就可以使用全部功能


作者:程序員三時(shí)
鏈接:
https://juejin.cn/post/7252712159561711674

分享到:
標(biāo)簽:SpringBoot
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定