亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

Spring Boot Bean定義覆蓋與@Primary:從啟動(dòng)報(bào)錯(cuò)到依賴注入歧義的徹底拆解

Spring Boot Bean定義覆蓋與@Primary:從啟動(dòng)報(bào)錯(cuò)到依賴注入歧義的徹底拆解 我見過太多次這個(gè)啟動(dòng)失敗了項(xiàng)目跑得好好的加了一個(gè)新的配置類或者順手升級了一次 Spring Boot結(jié)果一啟動(dòng)就紅屏核心報(bào)錯(cuò)就一句——The bean messageSender could not be registered. A bean with that name has already been defined ... and overriding is disabled。第一次踩的人通常很懵我明明沒有重復(fù)定義 Bean 啊等他把spring.main.allow-bean-definition-overridingtrue一開啟動(dòng)倒是過了過幾天又冒出來一個(gè)NoUniqueBeanDefinitionException或者更陰險(xiǎn)的——某個(gè)注入點(diǎn)悄悄用上了錯(cuò)誤的實(shí)現(xiàn)連異常都沒有。這篇就把 Bean 定義覆蓋Bean Definition Overriding和Primary之間那點(diǎn)糾纏不清的關(guān)系徹底拆一遍適合兩類人一類是剛被啟動(dòng)報(bào)錯(cuò)和注入歧義折磨的 Spring Boot 使用者另一類是寫公共配置、starter 的庫作者想搞清楚怎么避免自己的定義被別人覆蓋。1. 先從那個(gè)讓人頭疼的啟動(dòng)報(bào)錯(cuò)說起1.1 啟動(dòng)失敗和那條容易被忽略的 Debug 日志Spring Boot 2.1 是一個(gè)分水嶺。從它開始spring.main.allow-bean-definition-overriding的默認(rèn)值變成了false。也就是說容器在注冊一個(gè)新 Bean 時(shí)只要發(fā)現(xiàn)已經(jīng)存在一個(gè)同名的 BeanDefinition就直接拋BeanDefinitionOverrideException整個(gè)應(yīng)用啟動(dòng)失敗。你看到的失敗界面長這樣*************************** APPLICATION FAILED TO START *************************** Description: The bean messageSender, defined in class path resource [com/example/config/EmailSenderConfiguration.class], could not be registered. A bean with that name has already been defined in class path resource [com/example/config/SmsSenderConfiguration.class] and overriding is disabled. Action: Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overridingtrue這段報(bào)錯(cuò)信息其實(shí)已經(jīng)把答案寫在臉上了有人在你之前注冊了一個(gè)叫messageSender的定義你這次又注冊一個(gè)同名定義默認(rèn)行為不允許覆蓋。很多人的直覺反應(yīng)是那我把spring.main.allow-bean-definition-overriding改成true不就行了確實(shí)能啟動(dòng)但代價(jià)是把問題從啟動(dòng)期暴露推遲到了運(yùn)行期埋雷。當(dāng)你打開org.springframework.beans.factory.support.DefaultListableBeanFactory的 DEBUG 日志時(shí)會(huì)看到這樣一條輸出DEBUG ... Overriding bean definition for bean messageSender with a different definition: replacing [Generic bean: class [com.example.sender.SmsMessageSender]; primarytrue; ...] with [Generic bean: class [com.example.sender.EmailMessageSender]; primaryfalse; ...]注意看末尾的兩個(gè)屬性primarytrue變成了primaryfalse。這就是覆蓋和Primary產(chǎn)生沖突的核心覆蓋從頭到尾只管名字這一個(gè)維度它根本不關(guān)心被換掉的那個(gè)定義是不是被標(biāo)記成了 primary。環(huán)境配置同名 Bean 注冊的結(jié)果Spring Boot 2.1底層 Framework 默認(rèn)允許覆蓋后注冊的定義靜默替換先注冊的默認(rèn)無日志Spring Boot 2.1allow-bean-definition-overridingfalse默認(rèn)啟動(dòng)失敗拋BeanDefinitionOverrideExceptionSpring Boot 2.1allow-bean-definition-overridingtrue啟動(dòng)通過按角色輸出 INFO/DEBUG/TRACE 覆蓋日志1.2 盲目開啟覆蓋后真正的坑是 Primary 失效我見過很多團(tuán)隊(duì)在啟動(dòng)失敗后采用的第一個(gè)方案就是打開覆蓋開關(guān)然后理直氣壯地繼續(xù)開發(fā)。結(jié)果沒過多久項(xiàng)目里冒出NoUniqueBeanDefinitionExceptionNoUniqueBeanDefinitionException: No qualifying bean of type MessageSender available: expected single matching bean but found 2: messageSender, wechatMessageSender為什么會(huì)這樣用一個(gè)很直白的比喻Bean 定義覆蓋就像換宿舍。原來是 A 同學(xué)住在messageSender這個(gè)房間里還掛著寢室長Primary的牌子。覆蓋動(dòng)作是把整個(gè)房間的住客換成 B 同學(xué)而 B 同學(xué)身上沒有戴牌子。于是當(dāng)同類型的其他同學(xué)數(shù)量超過一個(gè)時(shí)大家就不知道默認(rèn)該聽誰的了。更麻煩的是覆蓋這個(gè)過程沒有任何提示遷移的機(jī)制。原來掛在舊定義上的Primary、qualifier、scope 等標(biāo)記全部隨舊定義一起被丟棄。新定義說了算。所以問題的本質(zhì)不是要不要允許覆蓋而是覆蓋之后依賴注入該怎么仍然保持正確。這也是為什么這篇文章要把兩者放在一起講只談覆蓋不講Primary你早晚會(huì)在運(yùn)行期再踩一遍坑。2. 容器里到底發(fā)生了什么同名 Bean 注冊與覆蓋的底層邏輯2.1 bean 名是怎么來的方法名、類名、顯式命名要理解覆蓋先要理解名字從哪里來。Spring 內(nèi)部用DefaultListableBeanFactory的beanDefinitionMap一個(gè)ConcurrentHashMapString, BeanDefinition保存 Bean 定義key 就是 Bean 的名字。名字的生成規(guī)則很多實(shí)踐中最容易撞名的有這幾類組件掃描Component沒有指定名字時(shí)默認(rèn)是類名的首字母小寫SmsMessageSender變成smsMessageSenderBean方法沒有指定名字時(shí)默認(rèn)是方法名本身比如Bean public MessageSender messageSender()的 bean 名就是messageSender顯式命名Bean(smsMessageSender)、Component(smsMessageSender)這種最不容易撞別名Bean({smsMessageSender, primarySender})會(huì)產(chǎn)生一個(gè)主名和多個(gè)別名但別名的判斷邏輯和主名不完全一樣。覆蓋發(fā)生的條件只有一個(gè)兩個(gè)不同來源的 Bean 定義最終注冊了同一個(gè)主名。舉例說明下面這兩個(gè)定義一定是沖突的// 配置類 A Configuration public class SmsSenderConfiguration { Bean public MessageSender messageSender() { return new SmsMessageSender(); } } // 配置類 B Configuration public class EmailSenderConfiguration { Bean public MessageSender messageSender() { return new EmailMessageSender(); } }不管兩個(gè)類在工程里擺放的位置多優(yōu)雅、包名多清晰在容器眼里它們都往beanDefinitionMap里塞了同一個(gè) keymessageSender。第二次 put 就是在覆蓋第一次 put。2.2 registerBeanDefinition 的覆蓋判定源碼拆解覆蓋的判定邏輯集中在DefaultListableBeanFactory.registerBeanDefinition。核心邏輯我簡化后大概是這樣的BeanDefinition existing beanDefinitionMap.get(beanName); if (existing ! null) { // 1. 不允許覆蓋直接拋異常 if (!isAllowBeanDefinitionOverriding()) { throw new BeanDefinitionOverrideException(beanName, beanDefinition, existing); } // 2. 新定義的角色更“框架內(nèi)部”打 INFO if (existing.getRole() beanDefinition.getRole()) { logger.info(Overriding user-defined bean definition for bean beanName with a framework-generated bean definition: replacing [ existing ] with [ beanDefinition ]); } // 3. 新舊定義內(nèi)容不同打 DEBUG else if (!beanDefinition.equals(existing)) { logger.debug(Overriding bean definition for bean beanName with a different definition: replacing [ existing ] with [ beanDefinition ]); } // 4. 新舊定義完全等價(jià)打 TRACE else { logger.trace(Overriding bean definition for bean beanName with an equivalent definition: replacing [ existing ] with [ beanDefinition ]); } beanDefinitionMap.put(beanName, beanDefinition); } else { beanDefinitionMap.put(beanName, beanDefinition); }這段邏輯里有幾個(gè)值得記住的細(xì)節(jié)第一BeanDefinitionOverrideException是 Spring Framework 5.1 才加入的。在老的 Framework 版本里即使你想關(guān)掉覆蓋也沒有專門的異常類型可用。第二日志級別由角色role和定義是否相等共同決定。ROLE_APPLICATION0是用戶 BeanROLE_INFRASTRUCTURE2是框架內(nèi)部 Bean。當(dāng)一個(gè)框架內(nèi)部定義替換掉你的用戶定義時(shí)會(huì)打 INFO所以偶爾能在默認(rèn)日志里看到但兩個(gè)用戶定義互相替換時(shí)默認(rèn)只是 DEBUG。很多人開了覆蓋開關(guān)后什么都沒看到就是因?yàn)闆]開 DEBUG 日志。第三equals是逐字段比較的。你只是給后來的Bean方法加了一個(gè)Primary就會(huì)讓新定義和舊定義不相等從而從 TRACE 升級成 DEBUG但又不會(huì)到 INFO。這也是為什么覆蓋日志經(jīng)??吹靡娪挚床灰?。2.3 為什么 Spring Boot 2.1 把默認(rèn)值改成了 false有人會(huì)問Framework 默認(rèn)本來允許覆蓋Boot 為什么要冒天下之大不韙改成 false因?yàn)楦采w這件事的默認(rèn)行為太危險(xiǎn)了。在允許覆蓋且不輸出日志的情況下一個(gè)第三方庫的配置完全可以把你自己定義的RestTemplate、ObjectMapper、DataSource靜默替換成它自己的實(shí)現(xiàn)。應(yīng)用照樣啟動(dòng)線上表現(xiàn)卻突然不對勁排查成本極高。Spring Boot 2.1 做了一次吃力不討好的安全加固默認(rèn)禁止覆蓋寧可讓你在啟動(dòng)時(shí)看到紅屏也不要讓你在凌晨三點(diǎn)被一個(gè)不知道哪里來的 Bean背刺。需要明確一點(diǎn)這個(gè)默認(rèn)值是 Boot 層面的不是 Spring Framework 的。如果你脫離 Boot純用AnnotationConfigApplicationContext手動(dòng)構(gòu)建容器allowBeanDefinitionOverriding默認(rèn)仍然是 true。這也是為什么很多 Spring 老教程里根本沒有這個(gè)概念——他們用的是純 Framework 的老行為。3. Primary 介入注入競爭的完整規(guī)則3.1 從 determineAutowireCandidate 看 Bean 的選擇順序Primary解決的是完全不同的問題當(dāng)容器里有多個(gè)不同類型的同名 Bean 時(shí)不存在所謂選擇困難因?yàn)橥皇R粋€(gè)了Primary處理的是多個(gè)不同名字的同類型 Bean默認(rèn)注入時(shí)該選誰。依賴注入的解析入口是DefaultListableBeanFactory.doResolveDependency大致流程是根據(jù)注入點(diǎn)的類型收集所有該類型的候選 Bean如果只有一個(gè)候選直接使用如果多個(gè)候選調(diào)用determineAutowireCandidate決出勝者決不出就拋NoUniqueBeanDefinitionException。determineAutowireCandidate的簡化邏輯如下protected String determineAutowireCandidate(MapString, Object candidates, DependencyDescriptor descriptor) { // 第一優(yōu)先找 Primary 標(biāo)記的候選 String primaryCandidate determinePrimaryCandidate(candidates, requiredType); if (primaryCandidate ! null) { return primaryCandidate; } // 第二優(yōu)先按 Qualifier、字段名/參數(shù)名匹配 String qualifierCandidate determineQualifierCandidate(candidates, descriptor); if (qualifierCandidate ! null) { return qualifierCandidate; } // 都沒有返回 null由上層拋 NoUniqueBeanDefinitionException return null; }注意determinePrimaryCandidate內(nèi)部的實(shí)現(xiàn)很關(guān)鍵它會(huì)遍歷所有候選只要發(fā)現(xiàn)兩個(gè)候選都帶Primary直接拋 more than one primary bean found among candidates 的異常。也就是說Primary不是簡單的優(yōu)先標(biāo)記它要求同一類型里有且只有一個(gè)事實(shí)上的默認(rèn)項(xiàng)。3.2 Primary、Qualifier、字段名回退優(yōu)先級到底誰高很多人的誤區(qū)是有了 Primary 就萬事大吉。實(shí)際上從上面的代碼能看到Spring 的注入偏好順序是Primary標(biāo)記Qualifier顯式指定的 qualifier或者字段名/參數(shù)名與某個(gè) Bean 名恰好一致都不滿足拋異常。用一張表概括場景結(jié)果多個(gè)候選恰好一個(gè)帶Primary用這個(gè) primary Bean多個(gè)候選兩個(gè)以上帶PrimaryNoUniqueBeanDefinitionException提示有多個(gè) primary沒有 primary字段名/參數(shù)名與某個(gè) Bean 名相同按名字回退選中它沒有 primary但注入點(diǎn)帶Qualifier按 qualifier 匹配沒有 primary字段名也對不上NoUniqueBeanDefinitionException另外一個(gè)容易混淆的是Resource(name xxx)。它不是走doResolveDependency這條鏈路的而是由CommonAnnotationBeanPostProcessor按名字直接找 Bean基本不參與Primary競爭。所以如果你在字段上用Resource把它當(dāng)成按名字注入來理解就對了。還有一個(gè)經(jīng)常被忽略的細(xì)節(jié)Primary不是掛在實(shí)例上的而是掛在 BeanDefinition 上。AbstractBeanDefinition里有個(gè)primary布爾字段配置解析階段如果發(fā)現(xiàn) Bean 方法或組件類上有Primary就把它設(shè)為 true。這解釋了為什么覆蓋會(huì)丟掉 primary——覆蓋是整體替換 BeanDefinition舊的字段設(shè)置當(dāng)然跟著沒了。4. 三個(gè)真實(shí)沖突現(xiàn)場代碼、報(bào)錯(cuò)與根因4.1 現(xiàn)場一覆蓋開啟后Primary 靜默丟失場景是這樣項(xiàng)目里有一個(gè)MessageSender接口原本有 Sms 和 WeChat 兩個(gè)實(shí)現(xiàn)。Sms 通過Primary當(dāng)默認(rèn)實(shí)現(xiàn)WeChat 用獨(dú)立名字。Configuration public class SmsSenderConfiguration { Bean Primary public MessageSender messageSender() { return new SmsMessageSender(); } } Configuration public class WeChatSenderConfiguration { Bean public MessageSender wechatMessageSender() { return new WeChatMessageSender(); } }這個(gè)階段一切正常。某天同事加了一個(gè)郵件發(fā)送實(shí)現(xiàn)他圖省事把 Bean 方法名也寫成了messageSenderConfiguration public class EmailSenderConfiguration { Bean public MessageSender messageSender() { return new EmailMessageSender(); } }在 Spring Boot 2.1 默認(rèn)配置下啟動(dòng)直接失敗。同事為了快速解決問題往application.yml里加了spring: main: allow-bean-definition-overriding: true啟動(dòng)果然通過了。但此時(shí)容器里的messageSender已經(jīng)變成了EmailMessageSender而且沒有Primary。于是下面這個(gè)注入點(diǎn)在只有messageSender和wechatMessageSender兩個(gè)候選且都沒有 primary 的情況下開始看字段名回退Service public class NotificationService { private final MessageSender sender; public NotificationService(MessageSender sender) { this.sender sender; } }參數(shù)名sender既不匹配messageSender也不匹配wechatMessageSender直接拋NoUniqueBeanDefinitionException。更陰險(xiǎn)的變體是如果同事把構(gòu)造參數(shù)名正好寫成messageSenderSpring 會(huì)通過名字回退把EmailMessageSender靜默注入進(jìn)去整個(gè)系統(tǒng)一聲不吭。線上該發(fā)短信的地方全發(fā)了郵件這種事故比啟動(dòng)失敗難查十倍。根因覆蓋開關(guān)解決了啟動(dòng)失敗但沒有解決默認(rèn)實(shí)現(xiàn)被換掉的事實(shí)。Primary標(biāo)記丟失后所有依賴默認(rèn)實(shí)現(xiàn)的注入點(diǎn)全部懸空。4.2 現(xiàn)場二兩個(gè) Primary 的朋友誰都不讓誰這個(gè)場景和覆蓋關(guān)系不大但經(jīng)常被混在一起討論。假設(shè)兩個(gè)配置類分別聲明了不同的 Bean 名卻同時(shí)都標(biāo)了PrimaryConfiguration public class SmsSenderConfiguration { Bean Primary public MessageSender smsSender() { return new SmsMessageSender(); } } Configuration public class EmailSenderConfiguration { Bean Primary public MessageSender emailSender() { return new EmailMessageSender(); } }兩個(gè) Bean 的名字不沖突覆蓋從來不會(huì)發(fā)生。但當(dāng)你Autowired MessageSender時(shí)determinePrimaryCandidate會(huì)發(fā)現(xiàn)兩個(gè) primary于是拋異常NoUniqueBeanDefinitionException: No qualifying bean of type MessageSender available: expected single matching bean but found 2: emailSender, smsSender注意這個(gè)異常信息里有一個(gè)關(guān)鍵提示more than one primary bean found among candidates。這就是 多個(gè)同類型 Bean 多個(gè) Primary 的組合拳。Primary的設(shè)計(jì)前提是只有一個(gè)事實(shí)默認(rèn)項(xiàng)當(dāng)兩個(gè)人都想當(dāng)老大時(shí)容器直接罷工。根因Primary的約束不是可以用但不能多用而是同類型里只能有一個(gè)。這個(gè)約束由容器在注入時(shí)強(qiáng)制執(zhí)行。4.3 現(xiàn)場三第三方庫與業(yè)務(wù)代碼的同名換尸還有一個(gè)高頻場景來自公共庫。假設(shè)你們維護(hù)了一個(gè)user-common-starter里面定義了Configuration public class UserCommonAutoConfiguration { Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }業(yè)務(wù)工程里安全團(tuán)隊(duì)又寫了Configuration public class AppSecurityConfig { Bean public PasswordEncoder passwordEncoder() { return new CustomPasswordEncoder(); } }結(jié)果依然是啟動(dòng)失敗。為什么自動(dòng)配置里的ConditionalOnMissingBean沒有生效因?yàn)?Spring Boot 的自動(dòng)配置類是通過DeferredImportSelector加載的處理時(shí)機(jī)晚于普通用戶配置類。如果你的業(yè)務(wù)配置先注冊了passwordEncoder自動(dòng)配置的條件可以感知到并退讓。但如果你和第三庫都是普通Configuration它們的處理順序由配置類解析順序決定沒有先來后到的保障同名定義就撞上了。這個(gè)場景的典型誘惑是把庫里的 Bean 名改掉。但如果庫是第三方的你改不了如果庫是自研的你又擔(dān)心改了名字會(huì)影響歷史調(diào)用方。根因自動(dòng)配置有 back-off 機(jī)制普通庫未必有。依賴注入只看類型和名字/qualifier不看這個(gè) Bean 是我寫的還是庫寫的。5. 合理的解決姿勢從命名規(guī)范到 BeanFactoryPostProcessor5.1 根治一顯式命名消滅同名所有覆蓋問題的第一道防線是讓 Bean 名從一開始就不一樣。這是成本最低、效果最穩(wěn)的方案。Configuration public class SmsSenderConfiguration { Bean(smsMessageSender) Primary public MessageSender smsMessageSender() { return new SmsMessageSender(); } } Configuration public class EmailSenderConfiguration { Bean(emailMessageSender) public MessageSender emailMessageSender() { return new EmailMessageSender(); } }這樣兩個(gè)實(shí)現(xiàn)各有獨(dú)立名字類型相同也不影響共存。誰想當(dāng)默認(rèn)實(shí)現(xiàn)誰掛Primary誰想精確指定誰用Qualifier(emailMessageSender)。命名規(guī)范其實(shí)比大多數(shù)人想象的重要。我看到很多團(tuán)隊(duì)反復(fù)踩覆蓋坑根源是Bean方法名隨意取英文單詞就那幾個(gè)userService、dataSource、restTemplate到處撞。項(xiàng)目里強(qiáng)制統(tǒng)一規(guī)則后覆蓋問題能減少七八成。5.2 根治二把用哪個(gè)的意圖寫進(jìn)注入點(diǎn)Primary適合表達(dá)默認(rèn)用哪個(gè)但它不是一個(gè)排他性的協(xié)議。如果你真的需要精確選擇某個(gè)實(shí)現(xiàn)應(yīng)該把意圖明確寫在注入點(diǎn)上而不是指望選擇容器里的幸運(yùn)兒。構(gòu)造器注入里可以這樣寫Service public class NotificationService { private final MessageSender smsMessageSender; public NotificationService(Qualifier(smsMessageSender) MessageSender smsMessageSender) { this.smsMessageSender smsMessageSender; } }字段注入可以配合Resource(name smsMessageSender)或者干脆Service public class NotificationService { private final ObjectProviderMessageSender senders; public NotificationService(ObjectProviderMessageSender senders) { this.senders senders; } public void notify() { MessageSender primary senders.getIfAvailable(); // 或者遍歷所有實(shí)現(xiàn) senders.orderedStream().forEach(sender - sender.send(...)); } }ObjectProvider很適合默認(rèn)選 primary同時(shí)不排除其他實(shí)現(xiàn)的場景。它把選擇邏輯從容器內(nèi)部搬到了你的代碼里雖然多寫幾行但語義清楚得多。5.3 根治三順著條件裝配的規(guī)矩來讓自動(dòng)配置主動(dòng)退讓如果你是 starter 或者公共模塊的作者問題不能只靠使用方改名解決。要讓使用方覆蓋你的 Bean 時(shí)不產(chǎn)生沖突最好把條件裝配寫完整。Spring Boot 自動(dòng)配置的推薦做法是用ConditionalOnMissingBean表示使用方已經(jīng)定義了我就不注冊了用ConditionalOnProperty、ConditionalOnClass控制觸發(fā)范圍用AutoConfiguration(after ...)控制與其它自動(dòng)配置的先后關(guān)系如果擔(dān)心名字撞車Bean 名盡量帶模塊前綴比如userCommonPasswordEncoder。自動(dòng)配置因?yàn)镃onditionalOnMissingBean的存在天然逃避了大部分覆蓋沖突。普通Configuration庫沒有這個(gè)保護(hù)所以公共庫要么改成自動(dòng)配置要么至少要確保自己的 Bean 名足夠獨(dú)特??吹揭粋€(gè)第三方庫用了dataSource、restTemplate這種爛大街的名字你就該意識(shí)到它遲早給你惹麻煩。5.4 兜底四BeanFactoryPostProcessor 精確手術(shù)有些場景是誰也不能改名誰也不能刪但必須把 primary 調(diào)過來。這時(shí)候可以動(dòng)用BeanFactoryPostProcessor對 BeanDefinition 做定點(diǎn)修改。Component public class PrimaryMarkerFixer implements BeanFactoryPostProcessor { Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { DefaultListableBeanFactory dlbf (DefaultListableBeanFactory) beanFactory; BeanDefinition bd dlbf.getBeanDefinition(smsMessageSender); if (bd instanceof AbstractBeanDefinition abd) { abd.setPrimary(true); } } }原理是BeanFactoryPostProcessor的執(zhí)行時(shí)機(jī)在全部 BeanDefinition 注冊完成之后、Bean 實(shí)例化之前而且普通BeanFactoryPostProcessor的執(zhí)行順序晚于ConfigurationClassPostProcessor所以能拿到最終的注冊結(jié)果。但這個(gè)方法有幾個(gè)使用前提你要準(zhǔn)確知道目標(biāo) Bean 的名字和當(dāng)前狀態(tài)getBeanDefinition拿到的必須是同一個(gè)AbstractBeanDefinition不要在這里做任何實(shí)例化操作否則會(huì)打亂容器的初始化順序。這是一把手術(shù)刀不是常規(guī)武器。能用命名解決的就用命名不要一上來就改定義。5.5 最后的手段allow-bean-definition-overriding 什么時(shí)候真的值得開講了這么多必須承認(rèn)有些場景確實(shí)必須開spring.main.allow-bean-definition-overridingtrue。典型的場景包括從 Spring Boot 1.x 升級到 2.x/3.x老項(xiàng)目里有大量裸奔的同名 Bean短期改不完接入了閉源第三方庫對方的名字無法修改又沒有條件裝配測試環(huán)境需要快速替換某個(gè) Bean 的實(shí)現(xiàn)不值得大動(dòng)干戈。開啟前請至少做三件事把logging.level.org.springframework.beans.factory.support.DefaultListableBeanFactory臨時(shí)調(diào)到DEBUG看清到底有哪些覆蓋發(fā)生在啟動(dòng)日志里確認(rèn)每次覆蓋的舊定義和新定義分別是誰記錄覆蓋清單給后續(xù)清理留一個(gè)待辦。如果只是為了避免一次啟動(dòng)失敗而草率開啟那它就是在給運(yùn)行期埋雷。開啟后覆蓋日志里出現(xiàn)的每一行都是一個(gè)潛在的事故點(diǎn)。我的習(xí)慣是能不開就不開開了之后就當(dāng)自己欠了技術(shù)債必須盡快用命名和條件裝配把覆蓋點(diǎn)清掉。場景推薦做法自己的兩個(gè)配置類同名顯式命名給Bean(xxx)想給多個(gè)實(shí)現(xiàn)指定默認(rèn)其中一個(gè)加Primary其它用Qualifier精確選擇第三方庫同名且無法改名用BeanFactoryPostProcessor定位調(diào)整必要時(shí)才開覆蓋開關(guān)需要替換自動(dòng)配置的 Bean遵循ConditionalOnMissingBean換一個(gè)不同的名字同類型出現(xiàn)多個(gè) primary只保留一個(gè)Primary6. 排查清單按這個(gè)順序找問題最快6.1 先判斷你遇到的是哪一種覆蓋問題遇到問題別急著改配置先按下面的分支判斷啟動(dòng)直接失敗報(bào)could not be registered ... overriding is disabled→ 禁用覆蓋下的同名沖突啟動(dòng)成功但 DEBUG 日志里出現(xiàn)了Overriding bean definition for bean X ...→ 啟用覆蓋下正在發(fā)生替換你還沒意識(shí)到NoUniqueBeanDefinitionException提示found N: ...→ 這是注入決策問題先看有沒有 primary再看字段名NoUniqueBeanDefinitionException提示more than one primary bean found→Primary加多了。判斷錯(cuò)誤表格現(xiàn)象問題域解決方向啟動(dòng)失敗 同名注冊定義覆蓋改名 / 條件裝配調(diào)試日志出現(xiàn)覆蓋輸出定義覆蓋審計(jì)新舊定義來源注入歧義 無 primaryPrimary缺失指定 primary 或 qualifier注入歧義 多個(gè) primaryPrimary沖突只保留一個(gè) primary6.2 用 Actuator 和臨時(shí) Runner 把 Bean 定義攤開來看建議直接把 Spring Boot Actuator 的 beans 端點(diǎn)打開這是排查 bean 問題的第一利器。management: endpoints: web: exposure: include: beans啟動(dòng)后訪問/actuator/beans在返回的 JSON 里搜索你的 Bean 名。你會(huì)看到每個(gè) Bean 的resource來自哪個(gè)配置類、哪個(gè)方法、dependencies、scope等關(guān)鍵信息。兩個(gè)同名定義里只有一個(gè)最終存活從 JSON 里就能看出存活的是誰。如果需要更細(xì)的信息尤其是 primary 標(biāo)記直接寫一個(gè)臨時(shí)的 RunnerComponent public class BeanDefinitionDumper implements ApplicationRunner { private final ConfigurableApplicationContext context; public BeanDefinitionDumper(ConfigurableApplicationContext context) { this.context context; } Override public void run(ApplicationArguments args) { DefaultListableBeanFactory factory (DefaultListableBeanFactory) context.getAutowireCapableBeanFactory(); for (String beanName : factory.getBeanDefinitionNames()) { BeanDefinition bd factory.getBeanDefinition(beanName); String primary (bd instanceof AbstractBeanDefinition abd) ? String.valueOf(abd.getPrimary()) : N/A; System.out.printf(%s | %s | primary%s%n, beanName, bd.getBeanClassName(), primary); } } }把輸出的內(nèi)容存成文件按類型分組看。兩步就能確認(rèn)三件事哪些 Bean 名重復(fù)、最終留的是哪個(gè)定義、primary 標(biāo)記加在誰身上。6.3 別把另一條 BeanPostProcessor 警告混進(jìn)來排查時(shí)還會(huì)遇到一條看起來長得差不多的日志Bean xxx of type [...] is not eligible for getting processed by all BeanPostProcessors ...這條和覆蓋沒有關(guān)系。它出現(xiàn)在某個(gè) Bean 在BeanPostProcessor注冊完成之前就被提前實(shí)例化的時(shí)候典型來源是BeanFactoryPostProcessor或BeanDefinitionRegistryPostProcessor里手賤調(diào)了getBean??吹剿灰采w方向查要查的是誰在容器早期階段提前初始化了這個(gè) Bean。這兩條日志經(jīng)常在同一次啟動(dòng)里一起出現(xiàn)導(dǎo)致很多人把它們當(dāng)成同一個(gè)問題。分清楚之后排查會(huì)少走很多彎路。最后說個(gè)我自己的排查習(xí)慣處理這類問題我從來不先問Primary 加在哪而是先回答三個(gè)問題——這個(gè) Bean 叫什么名字、誰最后寫入了這個(gè)名字、注入點(diǎn)訂閱的到底是類型還是名字。三個(gè)問題答完九成的覆蓋沖突已經(jīng)能用命名和Qualifier解決剩下的才輪到覆蓋開關(guān)和BeanFactoryPostProcessor這種大殺器。Bean 定義覆蓋是配置之間的打架Primary只是裁判但裁判判不了名字完全相同的兩個(gè)人。先把名字理清楚比什么都管用。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
人人做人人妻人人夜视频| 爽 好舒服 无码刺激久久| 老鸭窝亚洲毛片| 精品亚洲一区在线观看| 人妻蜜桃臀| 日本福利社| 91性网| 五月天AV资源| 久久9久9久99久9久9| 麻花豆传媒剧国产MV出差| av影院十区| 激情色播| 巨爆乳一区二区爆乳区| 香蕉黄色一级视频| 丰满人妻一区二区三区色-百度| 色好看av| 亚洲情色五月天 | 国产丝袜高跟美女av免费观看| 99热在线观看| 国产精品久久久久久久久久梁医生| 国产精品视频一区二区三区八戒| 人人操人人干xxx| 精彩久久中文| 久久综合女优| 天美传媒AV在线| 在线电影亚洲色图| 国产噜噜噜噜噜久久久久久久久| a男人的天堂久久一级A毛片| 亚洲男人在线观看天堂| 97久久国产亚洲精品超碰热| 欧美夜夜狠| 近亲乱伦一区二区| 久久99亚洲精品久久99果| 久久久一区二区三区三州| 欧美色爱综合| 久久超碰天天| 日本国产二线女色| 久久久国产精品亚洲精品| 青青11操操操操操操操操| 最新国产亚洲精品精品国产亚洲综合| 操我无码| 黄色网址在线免费观看| 中国亚洲呦女专区| 亚洲天堂99| 一区二区三区精品久久| 免费看国产大AB| 91大学精品激情戏| 国产天美欧美| 久久精品店| 国产精品干干干| 久久精品日韩| 国产av又色又爽又黄| 中文字幕在线观看永久| 少妇啪啪自拍| 在线国产福利网址导航| 性爱乱伦一区| 国产又操| 精品少妇一区二区三区在线视频| 一区二区娱乐网站| 综合色区偷拍| 久久久久久久久久9| 无码人妻精品一区二区三区九九 | 亚洲鸥美色图| 99re这里只有精品2| 九九九九一区| 无码不卡八戒| 秋霞影音一区二区三区| 立川理惠无码一区二区| 综合色图区| 日本人体九九九九九九| 天天享受天天看| 欧美久久毛片基地| 好爽免费视频,| 熟女精品一区二区在线观看| 亚春色色| 日本媚薬中文字幕在线| 一本大道久| 大逼色网站| 五十路熟女人妻一区二区在线观看| 高清国产精品福利网站| 久久9精品| 日韩大香蕉AV影片| 日本熟女不卡视频| 三级三久久线久久99久目本WW| 激情综合五月| 九九九影院| 久久久精| 蜜桃久久久久久久| 精品久久在线区一区| AV丝袜少妇| 啪啪啪男女亚洲中文字幕99| 国产亚洲欧美每日在线| 深田咏美亚洲精品福利社| 熟女啪啪视频| 久久熟女嫩草成人片免费 | 亚欧高清| 99自拍视频| 欧美高潮在线| 超碰99re| 欧美真人抽搐一进一出gif| 操逼无码操逼| 91亚洲不卡一区| 久久久性爱| 亚洲字幕一区二区| 久操99| 人妻素股| 999亚洲国产视频| 91色碰| 啊啊啊啊啊舒服| 中文字幕日韩专区精品系列| 玖玖97综合 | 91丝袜美女视频| 亚洲AV无码黄色强奸| 日韩AV一区二区三区三州三州| 91老熟女91老女人| 青青伊人这里只有精品| 亚洲第一页第二页激情| 婷婷五月综合在线| 天天搞欧美| 成人26uuu| 涩涩五月天| 欧美一区二区三区黄色影视| 日熟女| 狠狠躁AV| 亚洲无码 国产无码| 丁香六月婷婷久久综合| 日韩超碰97| 色欲久久综合| 天天综合网~91| 亚洲AV无码黄色强奸| 日韩一级二级三级免费看完整版国语版 | 欧美综合色综合| 一级@啪啪视频| 激情 欧美 亚洲 小说| 亚殴在线| 午夜超爽| 丝袜狂射91| 国产精品视频麻豆入口| 91AV国产精品| 五月丁香激情综合| 免费中文综合精品| 91色伦综合| 亚洲第一精品在线视频| 亚洲双插| 精品少妇一区二区三区在线视频| 欧美操逼视频二区| 在线岛国新天堂8| 青青伊人久久| 最近的最新的中文字幕视频| 欧日韩一二三f区| 五月婷婷色色| 人妻另类 专区 欧美 制服| 18精品一区| 国产在线观看91精品一区| 欧美亚洲美少妇一区二区| 欧美日韩*字幕一区| 校园春色亚洲欧洲| 天天日天天操心| 在线免费观看高清无码视频| 嗯嗯啊啊好疼| 精品亚洲黄色片 国产精品导航一区二区| 91操人| 99色在线观看| 久久久久99精品成人片蜜臀| 十八禁黄色成人网站观看| 久久精品久久九九精品| 伊人网在线视频| 少妇丝袜在线观看AV| h无码动漫在线观看| KK色在线影院| 伊人久久大香线综合无码| 美国人人操人人操| 97在线免费| 久久久久久久久久久999| 99热婷婷| 国产人妖视频一区在线观看| 男人天堂资源| 女人18精品一区二区三区| 激情综合五月| 思思热国产在线视频| 亚洲图片视频小说| 国产美女91视频| AA丁香综合激情| 国产精品不卡一区二区电影| 四虎在线视频| 91男同| 青娱乐 成人娱乐在线| 日本 色 导航| 久艹日日日| 久九9精品| 成人A片男人的天堂| 久久婷婷色综合一区二区三区| 制度丝袜99| 老熟妇91| 78精品在线| 91爱做| 久久精品亚洲东京热色播| 操逼逼无码| 综合久久2017| 一起草视频在线| 欧美 熟女 日韩| 欧美天堂日韩三级国产传媒| 开心五月深爱五月| 啊啊啊用力在线观看| 日本欧美亚洲高清在线看| AAAA级日本片免费视频| 亚洲97在线观看| 亚洲丰满很很操| 夜夜 中文视频rt| 精品人人| 日韩精品人妻系列无码天堂| 天天综合影院91| 男人的天堂不卡一区二区| 强奸a片网| 黄色性爱网网| 人人摸人人叼| 五月丁香综合啪啪| 岛国精品视频在线观看| 色婷婷在线视频| 国产伦精品一区二区三区在线观| a级理论午夜日本| 在线a v| 久干9操| 国产精品色片一区二区| 思思热久久成人| 美国aaaaa一级黄片| 强歼乱伦资源网| 91精品国产91久久青草| 亚洲中文一区二区三区| 午夜色婷婷| 久操99| 人人澡人人爽人人精品| 骚人妻少妇视频| 国模91| 污污污8888| 天操天操夜操夜月月年年操操| 九九九草| 99少妇内射| 久久精品导航| 国模无码人体一区二区三| 亚洲无线观看久久| 免费观看性欧美一级| 亚欧性爱无码| 日韩性爱播放| 亚洲av热热色| 99热日| 偷拍视频青青草在线视频| 色香av| 国产在线视频午夜精华在| 香蕉热人人精品| 国产理论视频在线播放| 五月婷婷六月激情| 超碰人妻久久人妻中文97| 蜜桃丰满熟妇av无码区不卡| 精品久操| 无码一区免费在线不卡| 97色婷婷| 久久亚洲熟妇在线视频| 少妇三p| 99久国产精品午夜性色福利| 四虎影院成年人片| 91久久18禁| 欧美天天在线| 午夜视频久久久久一区| 欧美性爱系列| 亚州黄站| 亚洲精品影视老司机| 亚洲国产第一页综合视频| 少妇500双飞99| 大香蕉伊人75| 欧美成人性爱视频大全| 亚洲天堂第一页| 亚洲图片视频小说| 大香网站| 国产精品不卡一区二区三区| 欧美色涩| 五月丁香综合网| 日韩欧美水蜜桃人妻| 天美av在线| 日韩亚洲中文有码视频| 午夜激情床戏激情| 日日躁夜夜躁狠狠躁超爽| 一区AV| 五月婷丁香| 激情人妻另类| 精品人妻一区二区三区四区石在线 | 人妻美腿丝袜日韩| 国模艳艳啪啪一区| 中文字幕乱碼在线| 91色人妻| 91人人看| 欧美性爱日韩高清| 国产精品小视频一区二区三区| 亚洲精品1区| 久久天堂| 亚殴在线| 久久久精品91八戒| 久久中日麻豆| 操高情无码| 九九热超碰97亚洲最新香蕉| 高清国产成人无码| 91九九九吃| 国产91影院| 91 国产丝袜在线放观看| 日日躁狠狠躁天天躁精品| 无码日韩人妻av一| 日本久久久精品电影| 性做久久久久久免费观看软件| 男人的亚洲天堂| 欧美91精品国产自产| 欧美日韩高潮喷水91| 熟女91网站| 国产欧美第五页| 97碰碰色| 欧美色图亚洲特色| 精品少妇人妻av久久免费| 91成人社区| 人人潮人人摸| 97天天在线| 超碰人人在线| 色香天天| 牛牛久久国产精品视频一二三| 天天操人人操狠狠插| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 日本中文字幕在线电影| 少妇久久| 美女黑人91神马| 成人黑料社久久| 亚洲欧美清纯| 午夜性| av日韩在线观看电影| 国产日韩美女小穴视频网站不卡| 91人妻爽爽人人做人人澡| 精品一区二区三区麻豆| 国产精品欧美激在线| 91午夜无码| 亚洲精品熟妇1区2区3区。| 久久综合99| 亚洲色宗合| 97公开久久| 99操逼| 国产美女在线精品免费看| 九九热这里只有在线精品视 伊人草 成人菠萝蜜视频在线观看 | 呦女网站| 国产丰满熟夫69mpp| 欧美极品性爱天天射| 蜜臀久久99精品久久久久久成人小说| 精品人妻一区二区三区-国产| 手机在线人成免费视频| 一类av片在线看| 超碰99在线| 日日夜夜青青草母狗| 岛国片在线观看视频亚洲| 偷拍精品一区二区三区| 97人人夜| 热热色国产一二区AV| 久久久久成人蜜桃精品| 新版天堂中文资源8在线| 97手机日韩| 97干天天| 久久久久亚洲一区女同性恋中文字幕| 深爱激情五月天| 国产人妖的免费的视频| 本道综合精品| 热热热热日日漂亮永久永久国产日| 国产亚洲 中文欧美久久| 国产日韩精品人妻久久久久色欲网站| 四虎免费在线观看| 青青草在线视频美女| 西西美女视频网| 久久五月份| 9色在线| 日日噜噜夜夜狠狠视频无| 3PAV乱伦视频| 中出欧美| 91老妇女| 91精品国产91熟女| 欧美 日韩第一性色| 啊啊啊啊啊啊啊啊要喷了| 久久久9品一区二区三区| 99热9| 精品国产乱码久久久久久口爆网站| 欧美一级AAAAAAA| 天天爱天天操| 熟女乱伦二区| 天天做日日做天天欢。| 交换娇妻呻吟声不停中文字幕| 日本精品中文字幕视频| 男女啪啪网站免费视频| 天堂v无码免费视频| 九九九九九精品视频| 亚洲天天自拍| 蜜臀久久99精品久久久久久成人小说 | 欧美日韩中文视频播放| 亚洲激情视频| 久久国产在线一区二区| 欧美日韩国产另类综合| 国产 亚洲 一二三四| 欧美激情亚洲| 综合 亚洲 欧美| 欧美黑人熟妇精品91| 亚洲色91| 免费精品国偷自产在线在线 | 九九色逼| 久草久热| 久久综合超碰| 91麻豆天美国产欧美高潮| 男人天堂无码| 亚洲乱妇p22| jizz啪啪| 亚欧高清在线| 免费观看的av| 中出789在线视频| 岛国不卡超碰护士AV在线播放| 啊啊啊啊在线观看网址| 色九九久九九| 天天躁日日躁狠狠躁| 74成人在线| 韩国午夜理伦三级好看| 日本超碰在线国产一区| 九九九九九九亚洲| 941超碰| 国产精品久久久亚洲第一牛牛_在线观看| 精品久久久久综合无码| 性爱网站一区二区| 99久久9| 精品视频一区二区| 欧美gv在线观看| 亚洲日韩精品在线播放| 天天影视网综合少妇| 97视频620| 亚洲一区制服诱惑| 国产又黄又爽| 亚洲一本大道中文字幕无码在线| 中文字幕日产av人| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 天天日天天射天天干| 伊人久大| 精品久久久av无码免费| 粉嫩在线一区二区懂色| 亚洲永久永久永久永久一级一级一级精品 | 国产精品爱欲| 精品丰满人妻一区二区三区免费观| 91中文精品日韩欧美在线 | 人妻一二三区| 天天干2019| 小明看看网址| 国产成人亚洲精品无码最新在线| 午夜福利成人免费视频| 婷婷五月天无码 | 亚洲性网| 午夜精品久久久久久久男人的天堂| 国产污视频麻豆传媒一区二区| 国产怡红院在线| 欧美福利视频啊啊啊啊| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 色色操| 亚洲一区亚洲天堂| 自拍偷拍 日韩欧美| 男人天堂2019亚洲| 超碰九九| 免费毛片在线播放| 在线电影亚洲色图| 久草免费福利在线播放| 黑丝91视频| 国产女人视频三四五区| 日本福利二区视频| 免费男人的天堂| 国产91啪| 国产在线精品电影观看| 午夜福利1区2区3区| 人人妻人人操人人乐| 超碰97国产欧美| 中国大陆国产高清AⅤ毛片| 禁十八久久| 亚洲色图 欧美| 青娱乐 成人娱乐在线| 97日韩超碰超碰中文字幕| 亚洲成av人片色午夜乱码| 香蕉色网| 中文久久爆乳| 国语精品av| 加勒比大香蕉视频在线| 久热这里只有精品9| 九九久久精品| 97综合久久| 日韩欧美成人大香蕉| 日本精品五区| 久久久久久久久久久久黄色 | 校园春色美腿丝袜| 五月丁香综合网| 青青操国产夫妻| 九色97| 精品一区二区三区国产| 91在线超高颜值国产| 色眯眯射| 新婚人妻扶着粗大强行坐下| 美女爽到高潮91| 男人的天堂亚洲| 欧美AAAA黄片| 久久久亚洲精品电影免费看| 欧美人与动性人交a| 中文字幕在线观看第二页| 色屁屁影院www国产| 91久久久视| 蜜乳性色无码专日粉嫩骚逼AV| 99热99re6国产在线播放| 大香蕉黄色一区| 香蕉免费一区二区三区不读| 男人的天堂一区三区| 亚洲黄色| 亚洲三级网址久久最新| 日本三级一区二区 在线| 国产精品乱码久久久、久久| 翘臀vidoes| gogogo免费高清看中国国语| 久操影视| AND人妻系列| 亚洲无吗在线视频| 91内射| 精品久久大胆人体| 伊人综合色网| 波多野结衣先锋影音| 欧美 亚洲 在线| 黑人天8A∨高清网站| 欧美丰满熟妇XXXX性ppX人交| 女性91网站| 97操综合| 91中文精品日韩欧美在线| JULIA一区二区三区在线播放| 久久久久久久精| 日产123区精品免费观看| 97欧美性爱| 国产强奸乱伦第1页| 曰韩少妇无码| 超碰午夜在线| 国产av尤物| 久久毛卡| 欧美人人操人人插| 亚洲一区二区av| 日韩/97| 麻花豆传媒剧国产MV出差| 久久久久女教师免费一区| 骚逼一区二区| www鬼畜国产男人的天堂| 日本不卡高清视频| 亚洲h片在线免费观看| 久久久九| 亚洲春色欧美| 亚洲欧美日韩有码| 欧洲中文字幕| 欧美精品日韩一区二区| 热99这里只有精品| 成人精品在线免费视频| 久久久青青草| 91热热色| 密臀成人视频久久久| 夜夜综合| 超碰97欧美日韩| surenchaopeng| 久久久久亚洲一区女同性恋中文字幕| 成 人 影视 一区 二区 三区 四区| 丁香五月婷婷基地| 久久99亚洲精品久久99果| 日韩欧美亚洲一区二区三区影院| 狠狠操夜夜| 久久毛卡| 国产亚州精品美女久久久免费| 亚洲色色探花| 久久久久久久久成人av解说| 婷婷视频在线免费观看| 国产高清成人mv在线观看| 这里只有精品视频在线| 亚洲91极品| 激情久久av一区av二区av| 国产乱色国产精品免费视| 内射夫妻三片| 神马久久久久| 强奸乱伦AV网址| 2020中文字幕在线| 97色欧洲| 在线日韩日本亚洲国产| 水多多映视AV| 多毛小伙内射老太婆| 岛国黄色短视频| 人人操人人摸人| 亚洲欧洲综合视频在线| 啊好大好舒服| 成人在线视频一区| 91欧洲入口| 色路综合| 超碰国产精品无码| 福利在线观看一区二区| av资源在线播放天堂| 国产 码在线成人网站| 天天爽天天爽| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 亚洲色图91欧美日韩| 欧美 青青草| 亚洲天天影视综合网| 男生通女生屁股| 999久久久| 人妻系列无码专区中文有码| 五月婷婷色色| 97se综合| JuliaAnn丝袜熟女系列| 国产一区二区三区白丝| 一起草精品人妻| 欧美日韩高潮喷水91| 97二区四区| 青青草中日韩在线| 久久双插| 欧美99热| 国偷自 一区二区| 欧美色吧综合| 亚洲天天综合| ji熟女.com| 国语国产操逼伊人AV网| 亚洲国男人的天堂| 无码操逼天堂| 老外又粗又长一晚做五次| 操婷婷逼| 免费超碰97久久| 超碰97中文| 中文自拍欧美影视| 激情专区综合| 国产AV人人夜夜澡人人爽麻豆| 在线观看中文字幕| 欧美国产日韩高清在线| 欧天美中出| 国产强奸无码乱伦| 中出91| 大香蕉综合在线| 国产成人91一区二区三区| 国产成人在线观看综合| 狠狠爱夜夜干| 一本大道不卡一二三区| 综合 青草 伊久久 影院 综合 | 欧美日韩操逼动图| 综合久欧洲| 91性色| 精品国产www久久| 在线日韩精品一区二区三区| www.yw尤物| 久久风骚城市| 亚洲无线码一区国产欧美国| 性交一区二区在线播放| 亚洲国产尤物yw在线观看| 一区=区三区视频| 人妻一区二区三区四区视频| 色婷婷六月| 亚洲黄色电影| 色噜噜综合网| 色网亚洲人| 亚洲欧洲网站免费观看| 亚州九九九精品视频| 久久综合国产精品国产| 狠狠干精品一二三四五六2022| 久久大精品乱码视频人妻熟女| 中文?日韩?免费?精品| 欧美亚洲国内自拍| 色婷婷A V一二三四区麻豆综合| 欧美亚洲尤物久久| 免费看污网址| 久久久久人妻二区精品叶可怜| 中文字幕55555| 天天躁日日躁成人字幕aⅴ| 第四色色综合91| 亚洲无码精品AV久久久| 91精品91久久久中77777| 九九九九一区| 91oumei| 日韩av免费一级电影| 国产欧美日韩臀| 日本国产欧美高清在线| 人妻插插人妻人| 91亚洲欧美| 麻豆国产原创AV色哟哟| 黄片免费看的| 精品二区三四区五电影 | 亚洲亚洲亚洲天堂天堂| 五月天精品| 999精品久久久久久久| 欧美色图偷拍另类| 欧美性爱中文字幕无线码| 97 国产精品| 又大又黄国产| 欧美一级国产一级| 大香蕉草草| 懂色av一区二区三区天美传媒| 久久伊人网视频一区二区三区 | www.zbzhongsen.com| 综合色区偷拍| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 日韩精品 视频一区二区| 台湾佬中文娱乐网久久久久久久久久com| 日本欧美国内在线| 国产老太乱伦一区| 伊人aaa| 婷婷亚洲综合| 免费公开人人操| 超碰超碰超碰超碰的大鸡吧操黑丝袜| 嗯嗯嗯不要不要免费视频| 国产久久成人| 天堂亚洲精品| 中文一区在线日| 欧美另类色图片| 夜夜影视四色| 天天肏天天干| 人人操人人操人妻人| 久久天天摸| 日本肉体xxxx裸交| 懂色av色欲av蜜臀av| 欧美日韩狠狠爱| 日韩淫色网| 亚洲91av| 98一区二区精品| 中文操嬖片。| 在线无码视频| 九九九九一区| 9 9无尺码天堂网| 欧美狠狠弄| 综合熟女| 99ri在线视频| 日韩欧美午夜视频在线| 日韩欧美午夜一区二区| 精…码一二三区| 男人的天堂Va| 欧美后入式| 午夜后入| 免费网色网站| 少妇99成人麻豆| 蜜臀久久99精品久久久老,,| 三级片网站在线播放| av无码精品久久久久| 人妻丰满熟妇一区二区三| 黄骗免费网站| 后入式免费视频| 久久久久久久久久久久97| 久久影视二区三区行押| 亚洲av综合色区图片亚洲| 国产真实子伦对白| 丁香七月婷婷| 九九碰九九爱97超碰| 99re视频这里只有精品| 91熟女视频网| 久久久久久久久久久久97| 97精选久久| 中文在线久久字幕| 日本999精品视频| 少妇三P| 国内操逼视频二区| 伊人久久蜜月| 蜜桃臀一区二区三区久久| 久草精品视频| 91精品婷婷国产综合久久| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 永久电影三级在线观看| 性天堂| 欧洲在线性爱视频| 欧美色图 色综合图| 欧美在线天堂| 内射夫妻三片| 中文字幕一区二区三区高清| 无码av永久免费专区网站| 精品高清一区二区三区三州| 色久桃花影院在线观看| 亚洲无码AV九九九| 国产精品久久久久综合| www.99热| 性色avv| 午夜后入| 久久人妻一区二区三区高清| 热热色91| 午夜视频久久久久一区| 国产精品婬乱一级毛片彝族| 成人午夜无码视频| 欧美黑人XXXⅩ高潮交| 1234区中文字幕在线观看_青青草国产在线_日韩一区二区 | 99热免费| 中文字日本乱码| 亚洲美女黄色| 国产一二三在线视频五十路| 日韩极品无码B| 亚洲国产激情国产av| 久久午夜伦| 天天综合网入口~91| 久久精品六区| 国产v片在线免费观看| 91人精品妻入口| 日本污ww视频网站| 91亚洲青青草原精品1区| 天天影视射综合网| 精品国产乱码久久久久久蜜臀| 91免费看一区二区三区| 国产小u女在线观看| 97综合在线观看| 亚洲无限观看| 欧美第一页| 午夜福利免费福利视频| 97香焦色区| 美女的肌被草喷水视频| 天天操天天干美女网址导航| 色黄污美女啪啪啪免费网站| 五月丁香综合啪啪| 牛牛久久国产精品视频一二三| 9久9久| 日本不卡高清视频| 久久国产精品一级二级三级| 91麻豆一二三区| 91在线免费精品视频| 亚洲高清国产理伦片| 日本裸体久久色噜噜| 欧美—性—交—色| ..日韩av毛片精品久久久| 天美精品av| 中文字幕伊人| 国产乱伦亚洲| 中文久久一区| 先锋女优在线观看视频| 色婷婷五月综合激情中文字幕| 中文字幕丝袜人妻| 无码天堂| 久久女人一区二区三区| 亚洲熟妇综合久久久久久| 天天干天天舔| 丁香五月激情五月| 老子午夜伦不卡影院| 国产成人精品必看| 成年女人一区| 狠狠爱夜夜| 26uuu国产日韩综合在线观看| 五月天春色激情网| 欧美精品三区| 五月丁香| 欧美日韩在线小说| 精品国产乱码久久久久久久久1 | 色网在线视频观看免费| 精品人妻一区二区三区-国产| 天天肏视频| 欧美极品女人的天堂| 日本不卡一二区| 99色色| 青草精品视频一日本久久久久网站| 97人人模人人爽人人| 91热色| 人妻中文字幕日韩电影| 亚洲色综网| 亚洲成人性爱在线观看| 日本道日本道中文字幕日本道最新日本道在线观看 | 久久香蕉国产线看观看猫咪av| 天天插天天操天天摸天天射天天看| 欧美黄色大片在线观看 | 色吧5亚洲| 北条麻妃99精品青青久久| 国产无码成人无码| 97自拍一区| 大香蕉www.超碰| 日韩丨制服丨中文|在线| 亚洲无吗在线视频| 蜜桃午夜视频一区二区| 久久婷综合| 天堂成人网| 爱欲AV| 97视频在线免费观看| 超碰97资源中文字幕| 人人操人人插人www| 欧美色色人| www久久久| 天天干天天操天天操夜夜操天天操| 欧洲免费一区二| 欧美黄片免费在线观看视频| 亚洲 综合 第一页| 久99| 人人做天天爱| 男人成人黄色视频在线观看免费下载| 99亚洲天堂| 欧美日本不卡在线| 第四色色综合91| aaaa少妇高潮大片| 加勒比色99999| 人妻天天爽夜夜爽爽| 无码区蜜乳| 四虎精品一区| 天天操狠狠日夜夜干超碰撸com视频在线观看| 嗯嗯啊啊啊好爽| 精品国产91久久久久久一区黄无| 无码逼| 日日不卡av| 好看的91视频| 欧美在线观看综合国产| 天天综合网在线观看| 久久大线蕉一区| 国内三级自拍小视频在线观看 | 精品免费视频国产一区| 日韩精品第3页| JULIA一区二区三区在线播放| 久久精品店| 九九久久99| 免费男人的天堂| 性色高清在线| 91视频国品一二三区| 影音先锋日本乱伦| 婷婷激情丁香| 丝袜美腿校园春色| 717影院理论午夜伦八戒| AV天堂国产| 99热这里都是精品| 熟女网站最新| 综合网亚| 午夜精品99久久久久传媒| 婷婷激情五月天小说网| 国产精品99精品视频网站| 欧美性色网| 骚逼自拍99| 又黄又粗又硬又长又大| 91成人在线免费视频| 久久久久久久久久va| 久久久久久久精| 色欧美在线| 欧美日日人人天天| 后入式视频国产自| 伊人大香蕉在线| 欧美美女自慰一区二区三区| 色情五月综合婷婷| 精品人妻一区二区视频| 日韩福利综合一区| 欧美AAAA黄片| 国产精品剧情| 97亚洲在线| 欧美日本不卡| 九九人妻| 亚洲亚洲亚洲天堂天堂| 韩国女主播青草在线| 亚洲中文字幕乱码无码一区二区| 天天色悠悠激情| 激情五月天色播| 欧美亚州手机在线| 久久一二三四五六七八九区区区| 成人性爱电影一区二区| 亚洲精品人妻吞精av| 26uuu国产成人综合| 亚欧免费| 在线a v| 日本一级二级三级网站| 欧美精品日韩久久久九| 亚洲精品国产熟女久久久久久| 天天色黄色影院天天操| 亚洲成aⅴ人片不卡无码| 大香蕉乱级| 超碰美国| 国产激情视频一区区三区| 69视频入口| 91春色| 13小男生GAY自慰脱裤子| 国产传媒午夜理伦精品| 边做饭边操逼逼| 日韩综合无码色欲vv| 日韩A优精品在线观看| 激情无码日韩| 人妻少妇av在线观看| 色五月综合网| 91超级碰碰| 精品无码一区二区| 人人爽人人精品乱人伦AV| 欧美综合 站| av橘色网站| 久久久久久久9| 黄片www视频免费| 亚洲日本激情| 强奸a片网| 涩五月婷婷| 久久中文色图| 二级毛片| 舔足天天操天天射| 青草草免费网站av| 久操不卡视频| 麻豆精品久久久久久久| 五月天久久婷婷亚洲| 白嫩妹子国产骚| www.色婷婷.com| 大香蕉综合久久| 人妻熟女一区二区在线视频| 免费视频一二三区| 一区二区三区黄片免费观看| 99热超碰在线| 中文字幕在在线观看网站| 99色骚| 精品人妻少妇| 少妇啪啪自拍| 丰满人妻-区二区三区免费| 亚洲城人男人的天堂| 91美女国产在线| 亚洲日韩精品久久久久一区壹牛 | 麻豆国产96在线| 新婚人妻扶着粗大强行坐下| 五月开心网| 狠插 制服 自拍| 97在线日韩中文字幕| 欧美在线天堂| 香蕉黄色一级视频| 五月综合色| 免费草草草草草视频| 91色人| 青青免费在线视频一区| 五月激情影院| 男人的天堂在线2| 国产久久天堂资源| 手机在线中文字幕国产| 蜜桃视频精品一区二区| 久久久成人精品| 国产无吗在线播放| 欧美毛片在线网| 乱码人妻一区二区三区| 成人97人人超碰人人| 丝袜美腿诱惑亚洲欧美视频在线观看| 美女91在线观看| 亚洲美女av无码| 9色在线| 加勒比伊人综合| 久久久久亚洲熟妇熟女| 激情自拍 校园春色| 精久久久91| 日韩一级欧美一级国产一级台湾| 26uuu国产| 蜜臀va69| 操逼国产免费| 性老妇一区二区三区| 最新日本中文字幕| 人人扣人人操| 久久精品成人| 国产成人自拍视频在线| 久久蜜色情在线视频xxx免费观看| 日韩无码极品| 97久久久久久久精| 九九热精品视频六| 亚洲人妻av| 丝袜美腿91| 岛国精品视频在线观看| 97欧美色综合| 在线无码操| 国产精品午夜精品| 国产综合网站在线播放| 超碰在97| 亚洲成人性爱在线观看| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 人妻少妇色综合| 天天操天天射天天日| 欧美精品三区| 午夜精品久久久久久久99蜜桃一| 中文字幕精品乱码| 五月天丁香婷婷综合网站| 91国内外在线| 色久桃花影院在线观看| 久久精品99| 无遮挡猛进视频免费无限观看| 一起草三级AV电影在线观看| 日韩伦理视频| 欧美一区二区三区四区综合| 欧洲与亚洲欧美精品中文字幕| 国产综合在线视频网站| 久久精品中文| 日韩性爱播放| 噜噜噜噜久久久精品免费| 人妻天堂综合网| 偷拍 欧美 日韩| 97中文超碰| 欧美精品23| 国产熟码AV| 欧美亚洲丝袜人妻制服99| 综合久久9| 伊人玖玖网| 亚洲精品久久久久久久蜜桃臀| 啊啊啊 在线| 日本免费一区二| 久草免费福利在线播放| 青青草综合在线| 色性综合| 人妻三级在线中文字幕| 少妇人妻精品| 人人操人人肉久久精品| 蜜臀精品1区2区| 巨爆乳一区二区爆乳区| 欧美大香蕉97| 乱伦AVxx| 超碰在线免费一区二区三区| 国内外色色色色色成人视频| 97在线看| 欧美在线55555| 欧美一区二区三区互相| 在线中文AV| 天天日天天爽| 久久精品国产亚洲妲己影视| 男人的天堂日韩| 嗯嗯啊操我| 99久久精品无码一区二区毛片免费| 超碰久久精品| 国产欧美精选激情视频| 国产后入式在线观看| 日韩美女久久一区二区三区| 亚洲一区二区三区中文字幕| 亚洲高潮影院| 二三四区精品| 九月丁香婷婷| 六月丁香啪啪| AV一起草在线| 国产精品乱码久久久久| 国产女主播视频在线观看| 亚洲最大黄网| 国产精选三级在线观看| 久久久九九网站| 99久视频| 高清成年美女黄网站免费大全| 九九九精品美女| 大香蕉92| 亚洲男人天堂2012| 四虎影院成年人片| 人人妻人人爱人人玩| 亚洲天堂日本| 在线女人91| 久久久久9| 国产三级片在线观看| 亚洲综合大片| 嗯嗯啊啊亚欧精品| 激情五月天网站| www.91理论| 91AV入口| 免费精品无码一级毛片牛牛影视| aV中文麻| 91天天美女| 新97国产超碰| 99国产精品免费| 懂色AV中文| 青青草视频久久久久| 亚洲高潮少妇| 久久久久久久人妻| 久久婷婷色| 中文字幕 国产 精品| 天天看天天在线精品| 亚洲小电影免费涩涩成人在线高清| 插入逼91| 伊人网免费视频| 在线观看中文字幕| 超碰2017| av亚欧| 91丨国产丨白浆秘 洗澡动漫| 99少妇内射| 亚洲中文字幕熟女少妇一区二区| 久操频道免费在线呗看| 蜜臀Av一区二区三区| 中文字幕免费看| 欧美伦乱| 99rre在线精品99re8| 91精品网站| 国产成人五月天丁香花| 2017天天插| 欧美精品三级黄片| 国产精品懂色tv影视免费观看| 亚洲风情在线观看| 极品销魂美女一区二区|