SpringBoot 加載jar包配置類/SPI機制/自定義starter


簡介:使用SpringBoot開發應用,打包成jar包后,被別的項目引入時,需要注意直接引入不會對jar包里的配置類生效,需要如下配置才可以(五種方式任選一種)。

1. 配置@SpringBootApplication注解的掃描屬性

   在引入第三方jar包的服務啟動類上添加@SpringBootApplication注解,並配置scanBasePackages等屬性,指定需要掃描的配置類;

package com.ruhuanxingyun.dcy.service.manage;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableFeignClients
@EnableTransactionManagement
@MapperScan("com.ruhuanxingyun.dcy.service.manage.mapper")
@SpringBootApplication(scanBasePackages = {"com.ruhuanxingyun.dcy.service.manage", "com.ruhuanxingyun.dcy.common.jwt.config",
        "com.ruhuanxingyun.dcy.common.tool.config"})
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

2. 配置@ComponentScan注解的掃描屬性

   在引入第三方jar包服務的啟動類上添加@ComponentScan注解,並配置basePackages等屬性,指定需要掃描的配置類;

3. 引用自定義注解開關

  A. 第三方jar包里添加配置類;

package com.ruhuanxingyun.dcy.common.tool.config;

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

/**
 * @description: FastJson 配置
 * @author: ruphie
 * @date: Create in 2021/1/19 21:58
 * @company: ruhuanxingyun
 */
@Configuration
@ComponentScan(basePackageClasses = {FastJsonConfig.class})
public class FastJsonConfig {

    @Bean
    public HttpMessageConverter httpMessageConverter() {
        // 定義一個convert轉換消息的對象
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        // FastJson配置
        com.alibaba.fastjson.support.config.FastJsonConfig fastJsonConfig = new com.alibaba.fastjson.support.config.FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
        // 添加fastJson配置信息
        fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
        fastJsonHttpMessageConverter.setDefaultCharset(StandardCharsets.UTF_8);
        // 設置MediaType
        List<MediaType> supportedMediaTypes = new ArrayList<>();
        supportedMediaTypes.add(MediaType.APPLICATION_JSON);
        fastJsonHttpMessageConverter.setSupportedMediaTypes(supportedMediaTypes);

        return fastJsonHttpMessageConverter;
    }

}

  B. 第三方jar包里添加注解開關;

package com.ruhuanxingyun.dcy.common.tool.annotation;

import com.ruhuanxingyun.dcy.common.tool.config.FastJsonConfig;
import org.springframework.context.annotation.Import;

import java.lang.annotation.*;

/**
 * @description: FastJson配置注解
 * @author: ruphie
 * @date: Create in 2021/3/8 22:12
 * @company: ruhuanxingyun
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({FastJsonConfig.class})
public @interface EnableFastJson {
}

  C. 在引入第三方jar包的服務啟動類上添加注解開關。

package com.ruhuanxingyun.dcy.service.manage;

import com.ruhuanxingyun.dcy.common.tool.annotation.EnableFastJson;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableFastJson
@EnableFeignClients
@EnableTransactionManagement
@MapperScan("com.ruhuanxingyun.dcy.service.manage.mapper")
@SpringBootApplication(scanBasePackages = {"com.ruhuanxingyun.dcy.service.manage", "com.ruhuanxingyun.dcy.common.jwt.config"})
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

4. 配置類配置@Bean注解

   在引入第三方jar包的服務里添加配置類,同時使用@Bean配置需要使用的配置類;

package com.ruhuanxingyun.dcy.gateway.gateway.config;

import com.ruhuanxingyun.dcy.common.jwt.config.TokenProvider;
import com.ruhuanxingyun.dcy.common.tool.config.FastJsonConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @description: 公共 配置類
 * @author: ruphie
 * @date: Create in 2021/3/6 21:37
 * @company: ruhuanxingyun
 */
@Configuration
public class CommonConfig {

    @Bean
    public TokenProvider tokenProvider() {
        return new TokenProvider();
    }

    @Bean
    public FastJsonConfig fastJsonConfig() {
        return new FastJsonConfig();
    }

}

5. SpringBoot自動配置SPI機制

  A. 在第三方jar包的項目resources目錄下新建META-INF目錄,並創建spring.factories文件;

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.ruhuanxingyun.dcy.common.tool.config.FastJsonConfig

  B. org.springframework.boot.autoconfigure.EnableAutoConfiguration代表需要配置哪些類,\代表分行符,FastJsonConfig代表自動配置類,需寫入類全限定名。

 6. SpringBoot自動配置原理

  A. @EnableAutoConfiguration、@Configuration和@ConditionalOnClass三個注解構成自動配置的核心;

  B. @EnableAutoConfiguration給容器導入META-INF/spring.factories里定義的自動配置類;

  C. 篩選有效的自動配置類,每一個自動配置類結合對應的xxxProperties.java讀取配置文件進行自動配置功能。

 

可參考:SpringBoot SPI擴展機制


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM