国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

這可能是Spring Boot Starter 講的最清楚的一次了

數據庫 其他數據庫
spring-boot的強大之處在于其提供的大量starter組件,基本涵蓋了我們開發中的各個技術領域,比如數據庫訪問有jdbc、jpa,緩存有redis,全文檢索有elasticsearch,消息隊列有amqp、kafka等等。

哈嘍,大家好,我是指北君。

前面我們簡單介紹了如何使用消息中間件Apache Pulsar,但是在項目中那樣使用,顯然是不太好的,不管從易用性和擴展性來看,都是遠遠不夠, 為了和springboot項目集成,寫一個pulsar-spring-boot-starter是非常有必要的,在此之前,我們先看看一個starter需要些什么。

Spring Boot Starter

spring-boot的強大之處在于其提供的大量starter組件,基本涵蓋了我們開發中的各個技術領域,比如數據庫訪問有jdbc、jpa,緩存有redis,全文檢索有elasticsearch,消息隊列有amqp、kafka等等。

在項目中你只需要按需引入相應的依賴 spring-boot-starter-xxx ,然后只需要替換對應的配置參數即可,就能快速使用對應的功能,不得不說簡直是為開發者插上了翅膀。

命名風格

對于starter模塊如何命名,spring官方是這樣建議:

  • Spring官方命名格式為:spring-boot-starter-{name}
  • 非Spring官方建議命名格式:{name}-spring-boot-starter

準備工作

如果你之前有看過spring官方starter組件,你會發現主要是基于AutoConfigure及@Enable來實現的。

  • 其中AutoConfigure也就是我們常說的自動裝配,在spring-boot-autoconfigure包中的目錄/METE-INF/spring.factories對應文件中,你可以看到這樣的配置:

圖片

當啟動Spring Boot項目時這些配置都會被加載(這么多的配置全部加載并處理,難怪啟動那么慢)。

在starter中依賴的具體實現包中,一般都會提供一個@Enable注解作為部分擴展功能的開關,我們可以在系統中通過該注解引入按需引入配置

圖片


AutoConfigure配置的一定會被加載,而@Enable有開發者選擇使用使用,當然有些組件是沒有AutoConfigure,必須通過@Enable來啟用

下面我們先對這塊內容做個簡單的認識,方便后續在寫具體starter時知道怎么寫以及為什么那樣寫。

AutoConfigure

在目錄中創建src/main/resources/MATE-INF中創建文件spring.factories,定義SpringBoot應用啟動時的需要注冊的配置,這個主要是基于SPI機制來實現, 下面是當前spring-boot-autoconfigure中spring.factories文件的部分內容

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoCnotallow=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,\
...

配置在這里的帶有@Configuration的類(如果沒有被Conditional條件過濾掉)都會作為配置將相關Bean注冊到Spring容器.

主要實現基于@SpringBootApplication注解上的注解@EnableAutoConfiguration

Enable

以Spring Aop相關的注解@EnableAspectJAutoProxy為例,我們看下 Spring官方是怎么使用@Enable注解來實現配置加載的:

@EnableAspectJAutoProxy

改注解除了一般注解的基礎(@Target、@Retention)元素外,還包含了兩個配置屬性proxyTargetClass、exposeProxy以及一個@Import

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {

boolean proxyTargetClass() default false;

boolean exposeProxy() default false;

}

@Import

在@Import中我們可以配置需要導入的配置類,有以下幾個選擇:

  • 直接導入@Configuration標識的類
  • 導入實現了接口ImportBeanDefinitionRegistrar的類,來向容器注冊BeanDefinition
  • 導入實現了接口ImportSelector的類(不需要@Configuration)來選擇配置
@Import(AspectJAutoProxyRegistrar.class)

ImportBeanDefinitionRegistrar

在上面@EnableAspectJAutoProxy注解上,通過@Import,引入了AspectJAutoProxyRegistrar,而該類又實現了接口ImportBeanDefinitionRegistrar, 該接口能夠通過BeanDefinitionRegistry向Spring容器注冊我們期望的BeanDefinition,看代碼:

class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar {

@Override
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {

AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);

AnnotationAttributes enableAspectJAutoProxy =
AnnotationConfigUtils.attributesFor(importingClassMetadata, EnableAspectJAutoProxy.class);
if (enableAspectJAutoProxy != null) {
if (enableAspectJAutoProxy.getBoolean("proxyTargetClass")) {
AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);
}
if (enableAspectJAutoProxy.getBoolean("exposeProxy")) {
AopConfigUtils.forceAutoProxyCreatorToExposeProxy(registry);
}
}
}
}

這里我們可以拿到@EnableAspectJAutoProxy的元數據以及對應的屬性配置,這樣就可以基于開發者的配置實現不同邏輯

ImportSelector

上面說到了,@Import還可以配置實現了ImportSelector接口的類,進而控制具體需要使用的Configuration,下面是@EnableAsync中@Import配置的類

public class AsyncConfigurationSelector extends AdviceModeImportSelector<EnableAsync> {

private static final String ASYNC_EXECUTION_ASPECT_CONFIGURATION_CLASS_NAME =
"org.springframework.scheduling.aspectj.AspectJAsyncConfiguration";

@Override
@Nullable
public String[] selectImports(AdviceMode adviceMode) {
switch (adviceMode) {
case PROXY:
return new String[] {ProxyAsyncConfiguration.class.getName()};
case ASPECTJ:
return new String[] {ASYNC_EXECUTION_ASPECT_CONFIGURATION_CLASS_NAME};
default:
return null;
}
}
}

ImportAware

同樣和@Import配合使用,針對基于ImportSelector選擇的Configuration,只要實現了ImportAware接口,就可以拿到@Import對應@Enable注解的元數據

@Configuration
public abstract class AbstractAsyncConfiguration implements ImportAware {

@Override
public void setImportMetadata(AnnotationMetadata importMetadata) {
this.enableAsync = AnnotationAttributes.fromMap(
importMetadata.getAnnotationAttributes(EnableAsync.class.getName(), false));
if (this.enableAsync == null) {
throw new IllegalArgumentException(
"@EnableAsync is not present on importing class " + importMetadata.getClassName());
}
}
}

上面主要根據Spring源代碼中的例子,了解@Enable、@Import、ImportBeanDefinitionRegistrar、ImportSelector、ImportAware如何搭配使用, 從而實現Spring的動態配置,用一張關系圖表示:

圖片

relation

其他擴展

spring-boot-configuration-processor

我們知道SpringBoot的配置我們都會寫在application.yml(.properties)文件中,為了簡化配置工作,如果能有智能提示就好了。這不,別人也想到了。只用這樣做:

  1. 現在只需要在項目中引入依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
  1. 定義一個Properties文件
@Data
@ConfigurationProperties(prefix = "myProp")
public class MyProperties {
private Boolean enable;
private String name;
}
  1. 在Configuration中導入
@Configuration
@EnableConfigurationProperties({MyProperties.class})
public class WebApiAutoConfiguration {

}
  1. 打包
mvn clean install
  1. 生產metadata.json 可以看到,在jar中的/META-INF目錄下多了一個spring-configuration-metadata.json文件

@Conditional

實現spring bean的可插拔,我們可以基于屬性、配置、類或者Bean來控制配置(@Configuration)是否生效,常見的有下面的這些:

  • ConditionalOnBean 容器存在Bean時配置有效
  • ConditionalOnClass classpath中有指定class時配置有效
  • ConditionalOnMissingBean 容器不存在Bean時配置有效
  • ConditionalOnMissingClass classpath中沒有指定class時配置有效
  • ConditionalOnProperty 屬性配置對應值成立時配置有效

AutoConfigure和@Enable

AutoConfigure是在spring.factories中配置了就會加載,但是可以通過@Conditional讓配置中的Bean不生效;@Enable需要顯示地使用才能有效,且先于AutoConfigure生效,從而可以配合@Conditional來阻斷AutoConfigure的配置

結束語

由于Spring官方文檔對框架的介紹可以說是編程屆最為詳盡的,我們可以通過閱讀其文檔解決大部分開發中遇到的相關問題。

責任編輯:武曉燕 來源: Java技術指北
相關推薦

2023-02-26 10:14:51

Spring第三方庫

2018-09-12 09:34:11

ZooKeeper概念集群

2021-11-03 16:10:16

RedisJava內存

2018-07-04 09:42:19

Docker概念容器

2018-11-05 08:10:30

Netty架構模型

2023-01-11 08:24:32

2021-05-27 05:30:23

數據分析工具數據可視化

2020-05-17 16:06:47

ICMPIP協議網絡協議

2018-09-17 14:04:57

架構技術棧微信半月刊

2017-05-15 12:58:00

編程javaapl

2019-05-29 10:04:38

CAP理論 AP

2021-08-27 10:14:22

機器學習工具手冊人工智能

2020-03-05 15:12:51

數據分析人工智能運營

2025-11-17 09:19:10

AI模型開源

2018-10-25 09:37:02

Docker入門容器

2024-08-28 11:56:33

2025-11-26 00:00:55

2020-02-27 09:50:19

代碼開發工具

2020-06-09 11:15:29

Linux命令行電子書

2020-10-14 09:46:33

Spring MVC接口漏洞
點贊
收藏

51CTO技術棧公眾號

韩日av一区二区| 日韩视频在线观看| 免费欧美在线视频| 成人h猎奇视频网站| 国产乱码精品一区二三赶尸艳谈| 大尺度一区二区| 亚洲qvod图片区电影| 亚洲国产视频二区| 亚洲伊人久久大香线蕉av| 理论视频在线| 天海翼亚洲一区二区三区| eeuss影院一区二区三区| 精品国产拍在线观看| 国产免费成人av| 久在线观看视频| 日韩大片在线免费观看| 国产精品嫩草99a| 999精品网| 国产美女视频黄a视频免费| 国产成年精品| 久久久精品视频在线观看| 国产啊啊啊视频在线观看| 99久久精品费精品国产一区二区| 色综合影院在线观看| 亚洲国产成人精品女人| 欧美一级淫片播放口| 日本电影免费看| 国产中文字幕在线免费观看| 欧美日韩免费看片| 亚洲二区视频在线| 九九九伊在人线综合| 国产伦精品一区二区三区在线观看| 国产精品自拍首页| 麻豆国产精品官网| 国产欧美精品一区二区三区介绍| 五月激情久久久| 欧美日韩一区二区视频在线| 久久成人精品无人区| 无码人妻丰满熟妇区毛片18| 亚洲综合一二区| 免费黄视频网站| 亚洲黄在线观看| 1区2区3区在线| 日韩高清不卡av| 九色porny丨国产首页在线| 日韩色av导航| 久久精品国内一区二区三区水蜜桃| 久久精品91久久久久久再现| 国产美女精品写真福利视频| 欧美一级电影在线| 狠狠一区二区三区| 插插插亚洲综合网| 久久这里只有精品一区二区| 91精品久久久久久久久青青| 欧美性www| 精品国模在线视频| 91久久在线| 可以在线看的黄色网址| 欧美一区二区三区性视频| 精品产国自在拍| 午夜精品短视频| 色域天天综合网| 免费高清完整在线观看| 7777免费精品视频| 日本特黄久久久高潮| 天天影视色香欲综合| 久久久久久久久久亚洲| 国产成人久久精品77777最新版本| 中文在线中文字幕| 高清欧美性猛交xxxx| 99久久免费精品高清特色大片| 日本伦理一区二区| 日韩免费电影一区二区| 亚洲靠逼com| 欧美日韩国产高清电影| 欧美特黄一级大片| 性欧美.com| 国产精品久久久久一区| 在线国产1区| 国产久一一精品| 亚洲成人7777| 欧美777四色影| 精品剧情v国产在线观看| 欧美午夜激情视频| 国产精品av免费观看| 在线免费观看日本一区| 欧美在线观看视频一区| 在线视频观看你懂的| 日韩电影免费观看中文字幕 | 亚洲高清不卡| 天堂中文资源在线| 欧美激情第1页| 亚洲人成网站在线| 精品国产第一福利网站| 可以看毛片的网址| 91精品国产高清久久久久久久久| 国产视频一区二区三区在线观看| 户外露出一区二区三区| 永久免费网站视频在线观看| 精品国产91久久久久久老师| 日韩经典一区| 在线观看欧美亚洲| 久久伊人91精品综合网站| 国产精品久久久久aaaa樱花| 网站一区二区| 精品国产一区二区三区免费 | 亚洲一级片网站| 亚洲国产高清在线观看视频| gogo在线高清视频| 国产喷白浆一区二区三区| 高清av在线| 亚洲伊人久久大香线蕉av| 成人av高清在线| 91tv官网精品成人亚洲| 毛片手机在线观看| 偷拍视频一区二区| 91产国在线观看动作片喷水| 在线播放视频一区| 亚洲免费av网站| 中老年在线免费视频| 欧美色图另类小说| 亚洲欧美日韩一区二区在线| 99精品久久只有精品| 影音国产精品| 少妇一区二区三区| 日韩美女在线| 日本.亚洲电影| baoyu777.永久免费视频| 久久精品xxx| 日本道色综合久久影院| 日韩在线欧美在线国产在线| 精品日产卡一卡二卡麻豆| 欧美午夜免费电影| 成年人国产精品| 99久久久久免费精品国产| 国产精品日韩| 亚洲激情社区| 亚洲精品孕妇| **精品中文字幕一区二区三区| 999国产在线视频| 日本免费在线观看| 成年人视频在线免费观看| 番号集在线观看| 日韩中文在线字幕| 在线观看日韩羞羞视频| 91免费视频黄| 真实国产乱子伦对白视频| 日韩成人av网站| 欧美一区三区二区在线观看| 亚洲巨乳在线观看| 大伊香蕉精品视频在线| 色婷婷成人在线| 久草综合在线观看| 亚洲成人av在线影院| 大胆av不用播放器在线播放| 日韩精品成人av| 天堂中文在线视频| 精品麻豆一区二区三区| 激情视频免费网站| 992tv在线观看| bl在线肉h视频大尺度| crdy在线观看欧美| 99久久久久久中文字幕一区| 91久久久久| 亚洲成人精选| 国产成人av影院| 日av在线不卡| 青娱乐精品在线视频| 国产亚洲成年网址在线观看| 亚洲免费观看高清完整版在线| 这里只有精品视频在线观看| 亚洲欧美日本精品| 成人国产精品久久久| 国产成人免费高清视频| 亚洲成人第一| 第九区2中文字幕| 午夜视频在线观看网站| 国产女人18毛片水真多18精品| 欧美在线三级| 欧美激情第8页| 美女视频黄频大全不卡视频在线播放| 日韩一区二区电影在线观看| 久久久亚洲欧洲日产国码aⅴ| 日本成人三级| 桃乃木香奈av在线| 欧美在线xxx| 欧美18视频| 草草草视频在线观看| 国产无限制自拍| 人人干人人干人人| 蜜桃视频在线观看免费视频| 国产精品激情| 一区二区成人在线| 日韩专区在线播放| 亚洲国产高清国产精品| 国产一二在线观看| 四虎成人av| 国产女人18毛片水真多成人如厕| 91国产视频在线观看| 狠狠色狠狠色综合人人|