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

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

SpringBoot自動裝配原理小結

瀏覽:19日期: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久久,三上悠亚国产精品一区二区三区
美女毛片一区二区三区四区最新中文字幕亚洲 | 亚洲手机在线| 日本免费一区二区三区四区| 日韩大片在线播放| 久久麻豆精品| 首页亚洲欧美制服丝腿| 欧美久久精品| 久久精品人人| 蜜桃tv一区二区三区| 亚洲免费网址| 久久精品97| 香蕉成人av| 免费久久99精品国产自在现线| 国产精品毛片| 国产日韩欧美在线播放不卡| 久久中文字幕一区二区三区| 日韩免费久久| 亚洲人成高清| 日韩成人a**站| 香蕉精品999视频一区二区| 婷婷亚洲成人| 91亚洲国产成人久久精品| 午夜日韩福利| 麻豆高清免费国产一区| 99久久亚洲精品蜜臀| 蜜桃视频第一区免费观看| 麻豆精品一区二区综合av| 伊人久久高清| 久久国产成人| 国产h片在线观看| 性欧美长视频| 都市激情国产精品| 午夜精品影视国产一区在线麻豆| 美女av一区| av成人国产| 久久精品国产99国产| 丝袜美腿亚洲一区| 久草免费在线视频| 日本不卡的三区四区五区| 免费看av不卡| 欧美在线日韩| 国产午夜精品一区二区三区欧美| 久久中文欧美| 丝袜美腿高跟呻吟高潮一区| 精品资源在线| 蜜桃视频一区二区三区| 久久精品二区三区| 麻豆精品久久久| 日韩在线观看中文字幕| 91精品高清| 四季av一区二区凹凸精品| 日韩福利视频一区| 99国产精品久久久久久久| 国产成人精品一区二区三区视频 | 高清日韩中文字幕| 综合一区二区三区| 久久国产日本精品| 麻豆成人av在线| 日本亚洲不卡| 午夜一级在线看亚洲| 久久精品亚洲人成影院 | 欧美日一区二区三区在线观看国产免 | 激情视频一区二区三区| 国产成人精品三级高清久久91| 亚洲精品成a人ⅴ香蕉片| 91成人精品视频| 国产一区二区三区不卡视频网站 | 日韩毛片网站| 国产精品视区| 色偷偷偷在线视频播放| 久久三级中文| 美女国产精品久久久| 国产精品亚洲综合在线观看| 五月国产精品| 蜜臀av亚洲一区中文字幕| 亚洲激情中文| 激情欧美一区二区三区| 色老板在线视频一区二区| 国产自产自拍视频在线观看| 麻豆国产欧美日韩综合精品二区| 久久狠狠久久| 国产欧美二区| 国产欧美日韩精品一区二区三区| 午夜性色一区二区三区免费视频| 日韩一级不卡| 国产农村妇女精品一二区| 国产视频一区免费看| 亚洲一区网站| 免费精品视频在线| 亚洲一区二区av| 亚洲三级网址| 日韩激情啪啪| 91精品国产一区二区在线观看| 亚洲精品国产精品粉嫩| 日韩中文av| 国产精品三p一区二区| 国产日韩欧美在线播放不卡| 国产精品亚洲综合在线观看| 国产高清亚洲| 国产一区二区三区四区大秀| 福利一区在线| 激情丁香综合| 免费视频久久| 日本欧美一区| 麻豆精品一区二区综合av| 麻豆国产精品| 国产中文在线播放| 亚洲国产综合在线看不卡| 亚洲一区欧美二区| 日韩有码av| 麻豆精品一区二区综合av| 国产欧洲在线| 狠狠干综合网| 日韩精品视频中文字幕| 国产伦乱精品| 成人在线视频区| 免费视频国产一区| 亚洲日本三级| 精品一区二区三区中文字幕视频| 日韩一区二区三区免费播放| 亚洲免费播放| 日本电影久久久| 国产一区一一区高清不卡| 99久久久久国产精品| 亚洲人成在线影院| 国产在线观看91一区二区三区| 日韩三区免费| 亚洲一级大片| 精品亚洲成人| 婷婷色综合网| 国产图片一区| 九色精品91| 国产剧情一区| 激情偷拍久久| 国产精品久久久久久久久久妞妞| 中文字幕在线看片| 视频一区二区三区入口| 久久精品伊人| 噜噜噜久久亚洲精品国产品小说| 国产欧美日韩精品高清二区综合区| 国产高潮在线| 国产一区二区高清| 国产精品xvideos88| 一区二区视频欧美| 久久国产日韩欧美精品| 国产v综合v| 日韩va亚洲va欧美va久久| 久久久久中文| 欧美精品国产白浆久久久久| 999国产精品| 国产日韩免费| 中文在线一区| 国产美女高潮在线| 日本a口亚洲| 91久久久精品国产| 国内在线观看一区二区三区| 亚洲精品欧美| 激情婷婷综合| 四虎国产精品免费观看| 亚洲精品第一| 蜜桃tv一区二区三区| 精品一区二区三区免费看| 亚洲精品日本| 欧美日韩国产在线一区| 成人在线丰满少妇av| 日韩一区二区三区精品| 国产精品91一区二区三区| 福利欧美精品在线| 国产精品亚洲一区二区在线观看| 亚洲资源av| 99成人在线视频| 成人在线免费观看91| 国产日产一区| 亚州精品视频| 国产精品日韩| 欧美日韩国产观看视频| 国产精品第十页| 日韩精品午夜视频| 亚洲一区二区三区四区五区午夜| 一本大道色婷婷在线| 久久精品九色| 国产欧美在线| 日韩精品亚洲专区在线观看| 亚洲一区二区三区四区五区午夜 | 国产精品第一国产精品| 亚洲精品乱码久久久久久蜜桃麻豆 | 欧美色图国产精品| 91嫩草亚洲精品| 精品国产乱码久久久久久樱花| 中文精品电影| 免费久久精品视频| 日韩精品一级二级| 亚洲免费网址| 国产亚洲福利| 在线亚洲国产精品网站| 亚洲激情久久| 午夜在线一区| 丝袜亚洲另类欧美| 在线精品福利| 午夜亚洲福利|