日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

SpringBoot自動裝配原理小結

瀏覽:21日期:2023-03-08 18:54:22
目錄springboot autoconfig的一些實驗SpringBoot autoconfig部分注解說明SpringBoot autoconfig原理starter

約定優于配置(Convention Over Configuration)是一種軟件設計范式,目的在于減少配置的數量或者降低理解難度,從而提升開發效率。

先總結一下結論:

springboot通過spring.factories能把main方法所在類路徑以外的bean自動加載,其目的就是為了幫助自動配置bean,減輕配置量

springboot autoconfig的一些實驗

一個springboot工程,springbootautoconfig.test.config這個包和啟動類的包不再同一個路徑下,那么這個包下的注解等應該不會生效,bean也無法托管給spring管理

SpringBoot自動裝配原理小結

@Configuration//開啟配置@EnableConfigurationProperties(HelloProperties.class)//開啟使用映射實體對象@ConditionalOnClass(TestHello.class)//存在TestHello時初始化該配置類@ConditionalOnProperty//存在對應配置信息時初始化該配置類(prefix = 'zxp.hello',//存在配置前綴zxp.hellovalue = 'flag')public class HelloAutoConfiguration { @Autowired private HelloProperties helloProperties; @Bean//創建HelloService實體bean @ConditionalOnMissingBean(TestHello.class)//缺失HelloService實體bean時,初始化HelloService并添加到SpringIoc public TestHello helloService() {System.out.println('>>>The TestHello Not Found,Execute Create New Bean.');TestHello testHello = new TestHello(helloProperties.getName(),helloProperties.getFlag());return testHello; }}

@ConfigurationProperties(prefix = 'zxp.hello')@Datapublic class HelloProperties { private String name; private String flag;}

public class TestHello { String name; String flag; public TestHello(String name, String flag) {this.name = name;this.flag = flag; } public String print(){String msg = 'name is '+name + ' ' + 'flag is '+flag;System.out.println(msg);return msg; }}

在resources下創建META-INF路徑,并創建spring.factories文件

#配置自定義Starter的自動化配置org.springframework.boot.autoconfigure.EnableAutoConfiguration=springbootautoconfig.test.config.HelloAutoConfiguration

再試啟動又報錯了

- Bean method ’helloService’ not loaded because @ConditionalOnProperty (zxp.hello) did not find property ’flag’

原因是,如果沒有配置zxp.hello.flag,怎會報錯

@ConditionalOnProperty//存在對應配置信息時初始化該配置類(prefix = 'zxp.hello',//存在配置前綴hello value = 'flag'//開啟)

在application.properties中添加

zxp.hello.flag=2

成功了,訪問controller

name is null flag is 1SpringBoot autoconfig部分注解說明

@ConditionalOnXxx 可以根據條件來決定是否執行自動配置

@ConditionalOnBean:當SpringIoc容器內存在指定Bean的條件@ConditionalOnSingleCandidate:當指定Bean在SpringIoc容器內只有一個,或者雖然有多個但是指定首選的Bean@ConditionalOnMissingBean:當SpringIoc容器內不存在指定Bean的條件@ConditionalOnClass:當SpringIoc容器內存在指定Class的條件@ConditionalOnMissingClass:當SpringIoc容器內不存在指定Class的條件@ConditionalOnExpression:基于SpEL表達式作為判斷條件@ConditionalOnJava:基于JVM版本作為判斷條件@ConditionalOnJndi:在JNDI存在時查找指定的位置@ConditionalOnResource:類路徑是否有指定的值@ConditionalOnProperty:指定的屬性是否有指定的值@ConditionalOnNotWebApplication:當前項目不是Web項目的條件@ConditionalOnWebApplication:當前項目是Web項目的條件@AutoConfigureBefore@AutoConfigureAfter@AutoConfigureOrder

public @interface ConditionalOnProperty { String[] value() default {}; //數組,獲取對應property名稱的值,與name不可同時使用 String prefix() default '';//property名稱的前綴,可有可無 String[] name() default {};//數組,property完整名稱或部分名稱(可與prefix組合使用,組成完整的property名稱),與value不可同時使用 String havingValue() default '';//可與name組合使用,比較獲取到的屬性值與havingValue給定的值是否相同,相同才加載配置 boolean matchIfMissing() default false;//缺少該property時是否可以加載。如果為true,沒有該property也會正常加載;反之報錯 boolean relaxedNames() default true;//是否可以松散匹配,至今不知道怎么使用的 } SpringBoot autoconfig原理

springboot啟動類注解@SpringBootApplication引入@EnableAutoConfiguration又引入@Import(AutoConfigurationImportSelector.class)

AutoConfigurationImportSelector類中調用SpringFactoriesLoader.loadFactoryNames 方法掃描了所有JAR包的META-INF/spring.factories,如下代碼:

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) { List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader()); Assert.notEmpty(configurations, 'No auto configuration classes found in META-INF/spring.factories. If you ' + 'are using a custom packaging, make sure that file is correct.'); return configurations;}public static final String FACTORIES_RESOURCE_LOCATION = 'META-INF/spring.factories';public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) { …… Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) : ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION)); result = new LinkedMultiValueMap<>(); while (urls.hasMoreElements()) {

spring-boot-autoconfigure包內的spring.factories文件內容

……work.boot.autoconfigure.EnableAutoConfiguration=org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,……

包含了所有spring為其增加的自動配置的bean配置,這些bean在滿足條件后會被加載到spring上下文中,從而實現了自動配置

eg:

@Configuration(proxyBeanMethods = false)@ConditionalOnClass({ RabbitTemplate.class, Channel.class })@EnableConfigurationProperties(RabbitProperties.class)@Import(RabbitAnnotationDrivenConfiguration.class)public class RabbitAutoConfiguration {

會發現RabbitTemplate會報錯,為什么這里不存在的類卻不報錯呢? 1、這個jar編譯時這個類是有的,保證編譯能過 2、看下ConditionalOnClass注解的注釋

The classes that must be present. Since this annotation is parsed by loading class bytecode, > it is safe to specify classes here that may ultimately not be on the classpath, only if this annotation is directly on the affected component and not if this annotation is used as a composed, meta-annotation. In order to use this annotation as a meta-annotation, only use the name attribute. Returns: the classes that must be present

必須出現的類。由于此注釋是通過加載類字節碼來解析的,因此在此處指定最終可能不在類路徑上的類是安全的,前提是此注釋直接位于受影響的組件上,而不是將此注釋用作組合的元注釋。要將此注釋用作元注釋,請僅使用name屬性。

starter

starter就是整理了依賴的maven配置,主要指maven相關依賴配置到單獨的一個工程以避免引入過多的maven配置

以上就是SpringBoot自動裝配原理詳解的詳細內容,更多關于SpringBoot自動裝配原理的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩午夜高潮| 日韩午夜视频在线| 国产一区二区三区日韩精品| 亚洲精品欧洲| 喷白浆一区二区| 亚洲在线久久| 国产亚洲精品美女久久| 91福利精品在线观看| 国产日韩亚洲欧美精品| 国产精品美女久久久久久不卡| 日本午夜免费一区二区| 亚州国产精品| 日韩精品第二页| 日韩一区二区三区高清在线观看 | 中文字幕成人| 伊人精品一区| 国产色播av在线| 欧美va天堂在线| 久久不射中文字幕| 国产情侣久久| 精品一区二区三区中文字幕| 新版的欧美在线视频| 亚洲午夜精品久久久久久app| 美女久久一区| 亚洲精品自拍| 久久精品国产久精国产爱| 成人福利av| 亚洲欧美日韩专区| 国产精品中文字幕制服诱惑| 国产aa精品| 色婷婷狠狠五月综合天色拍| 不卡av一区二区| 成人久久一区| 成人美女视频| 亚洲精华国产欧美| 亚洲成人精品| 欧美午夜不卡| 亚洲色诱最新| 日本欧美久久久久免费播放网| 亚洲一区二区av| 你懂的国产精品| 久久精品国产99久久| 久久久久久夜| 亚洲a一区二区三区| 亚洲精品亚洲人成在线观看| 午夜影院一区| 国产精品久久观看| 麻豆久久精品| 国产伦理一区| 波多野结衣一区| 日韩激情综合| 五月综合激情| 久久中文欧美| 亚洲深夜福利在线观看| 国产精品久久| 国产99久久| 日韩三级一区| 日韩免费小视频| 伊人www22综合色| 在线 亚洲欧美在线综合一区| 国产欧美69| 欧美一区久久久| 日韩1区2区3区| 高潮一区二区| 亚欧洲精品视频在线观看| 国产一二在线播放| 欧美一级一区| 欧美日韩四区| 国产激情精品一区二区三区| 99热精品久久| 91午夜精品| 欧美中文日韩| 欧美亚洲在线日韩| 欧美日韩伊人| 中文字幕色婷婷在线视频| 一二三区精品| 国产精品xvideos88| 亚洲精品麻豆| 日韩一区中文| 免费人成在线不卡| 亚洲18在线| 不卡视频在线| 亚洲欧美伊人| 日韩精品第一区| 麻豆高清免费国产一区| 亚洲精品美女91| 激情综合网站| 久久久久久久久久久9不雅视频| 精品国产乱码久久久久久樱花| 日韩高清电影免费| 国产精品**亚洲精品| 国产视频欧美| 亚洲一区欧美激情| 国产精品videosex极品| 日韩1区2区| 亚洲国产影院| 精品中文字幕一区二区三区av| 中文字幕在线免费观看视频| 狠狠爱www人成狠狠爱综合网| 日韩一二三区在线观看| 国产精品亚洲欧美日韩一区在线 | 欧美精品黄色| 欧美日韩黑人| 久热re这里精品视频在线6| 日本亚洲不卡| yellow在线观看网址| 国产韩日影视精品| 日韩高清电影免费| 久久一区精品| 91精品啪在线观看国产18| 国产精品美女久久久浪潮软件| 亚洲女同中文字幕| 精品色999| 天堂成人国产精品一区| 日韩亚洲精品在线观看| 国产欧美一区二区三区精品观看| 国产亚洲字幕| 国产欧美日本| 欧美影院三区| 欧美成人精品一级| 亚州av日韩av| 久久国产日本精品| 日韩av成人高清| 男女激情视频一区| 成人片免费看| 久久久久九九精品影院| 免费久久99精品国产自在现线| 日韩精品一二三四| 91av亚洲| 国产激情精品一区二区三区| 99久久精品国产亚洲精品| 国产视频久久| 日韩不卡免费高清视频| 日本伊人久久| 久久国产电影| 国产一区二区视频在线看| 久久国产精品美女| 亚洲精一区二区三区| 亚洲作爱视频| 久久国产三级精品| 在线精品一区二区| av亚洲一区二区三区| 久久亚洲一区| 亚洲男人在线| 久久一二三区| 免费成人在线视频观看| 成人在线黄色| 久久精品亚洲一区二区| 麻豆一区二区在线| 久久精品一本| 欧美日韩伊人| 亚洲综合三区| 亚洲综合欧美| 亚洲人成网77777色在线播放 | 国产视频一区三区| 国产亚洲午夜| 亚州国产精品| 亚洲尤物在线| 桃色av一区二区| 日韩av首页| 久久中文字幕av| 亚洲一卡久久| 日本欧美在线看| 91精品丝袜国产高跟在线| 亚洲精品伦理| 国产精品中文字幕制服诱惑| 国产精品久久久久9999高清| 免费成人在线视频观看| 亚洲天堂免费| 日本久久综合| 精品五月天堂| 麻豆一区二区三区| 亚洲v在线看| 精品欧美久久| 国产精品视频一区二区三区四蜜臂| 欧美一级全黄| 国产一区二区三区91| 女人av一区| 国产福利资源一区| 久久一级电影| 国产精品一区二区精品视频观看| 老司机免费视频一区二区| 老司机免费视频一区二区三区| 亚洲www啪成人一区二区| 日韩在线卡一卡二| 三上悠亚国产精品一区二区三区| 蜜臀久久99精品久久久久宅男| 国产欧美高清| 久久影院资源站| 日本va欧美va瓶| 夜夜精品视频| 韩国女主播一区二区三区| 国产亚洲综合精品| 久久精品导航| 91精品一区国产高清在线gif| 国产精品网站在线看| 麻豆精品网站| 精品国产免费人成网站| 在线人成日本视频| 国产精品.xx视频.xxtv|