久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

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è)新的配置類或者順手升級(jí)了一次 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)掉覆蓋也沒有專門的異常類型可用。第二日志級(jí)別由角色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 升級(jí)成 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)卻突然不對(duì)勁排查成本極高。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)先級(jí)到底誰高很多人的誤區(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字段名也對(duì)不上NoUniqueBeanDefinitionException另外一個(gè)容易混淆的是Resource(name xxx)。它不是走doResolveDependency這條鏈路的而是由CommonAnnotationBeanPostProcessor按名字直接找 Bean基本不參與Primary競爭。所以如果你在字段上用Resource把它當(dāng)成按名字注入來理解就對(duì)了。還有一個(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對(duì) 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 升級(jí)到 2.x/3.x老項(xiàng)目里有大量裸奔的同名 Bean短期改不完接入了閉源第三方庫對(duì)方的名字無法修改又沒有條件裝配測試環(huán)境需要快速替換某個(gè) Bean 的實(shí)現(xiàn)不值得大動(dòng)干戈。開啟前請(qǐ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。看到它不要往覆蓋方向查要查的是誰在容器早期階段提前初始化了這個(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少妇| 九九九午夜| 天天综合麻豆视频| 精品久久一区二区三区四区五区| A级国产欧美激情在线| 人妻无码久久一区二区三区免费| 在线播放成人高清免费视频| 人人澡人人澡人人| 91精品丝袜久久久久久| 在线无码视频| 奶水 人妻 哺乳 在线| 成人 日韩欧美一区| 人妻另类 专区 欧美 制服| 欧美亚洲厕所精品偷拍91| 亚洲五月婷婷| 操操逼视频| 亚州高清AV| 欧美日韩理论一区| 欧美 日韩 国产传媒| 狼人久草| 91碰超| 呦呦一区| 国产99热| 久久久久久999| 夜夜爽夜夜摸夜夜操免费视频| 97人肏| 99视频这有这里有精品| 蜜臀中文字幕| 东北熟女91| 色香91| 99xav| 国产精品经典一卡久久久 | 中文字幕,人妻,日韩| 97资源站国产精品| 激情另类激情| 国产免费内射视频| 欧美偷偷网| 日韩国产十八禁| 亚欧精品久久久久久久久久久| 亚洲最大AV网| 99日韩| 网页导航五月天免费一二三区| 亚洲精品97| 爱爱啊啊啊| 久久永久无码人妻视频| 国产91亚洲精品一区二区三区| 欧美欧美少妇| 翔田千里AV无码秘 三区| 日韩电影免费网站麻豆视频| 日本免费二区三区| 欧亚三区动漫| 人妻熟妇一区二区三区| 91天堂| 99热在线播放| 99婷婷| 五月丁香色色网| 你想操日本小逼吗| 欧美日韩中文亚洲v在线综合| 成年人一级黄色毛片大全在线观看| 99久久久无码精品国产人| A 在线网址| 最新av网站在线观看| 另类图片欧美激情综合| 午夜视频好爽啊| 成人五级久久| 国产一级做a爰大片免费久久| 曰韩精品视频一区二区| 久久高清欧美国产| 99久久99九九99九九九| 99免费视频| 国产超碰国产97| 狠狠中文字幕| 激情终合网| 亚洲伊人久久精品影院| 亚洲欧美日韩不卡人妻| 亚洲阿v天堂在线| 7777奇米影视久久| 久热无码| 久九九九九九九热| 91 国产丝袜在线播放-百度| 男同专区一区二区三区在线| 亚洲国产一区二区入口| 澳门成人网站久国产日韩| 中文字幕一区av| 日韩伦理久 久久 清纯| 伊人久久亚洲色欲综合网站 | 蜜桃臀av一区二区| 国产婷婷综合在线观看| 欧美色婷婷| 国产有码一区| 日本黄色XXX| 国产精品九九九| 白嫩少妇| 国产97色在线| 小草av不卡亚洲二区| 一区 欧美 日韩 麻豆| 亚洲脚交| www亚洲免费| 亚洲天堂区| 青春草A| 96国产精品| 色综合V| 亚洲精品天堂久久A∨51成人漫| 日本精品一区二区中文字幕| 大香蕉啪啪啪啪在线| 久久久无码精品人妻二区 | 精品毛片久久久精品毛片| 国产suv精品一区二区四区999| 欧美激情精品久久久| 男人的天堂久久| 涩涩这里只有精品视频| 日本天天人人狠狠在线日美女 | 国产九九九九九九九九| 强奸熟女一区二区三区| 欧美精品23| 天天欧美色| 中文有码9| 亚洲国产激情国产av| 婷婷丁香一区二区三区| 色哟哟 日韩精品| 国产精品午夜高潮呻吟久久av| 麻豆天美传媒在线视频天堂| 91久久青青草原精品| 日韩精品一区二区三区色欲| 性色高清..……| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 亚洲精品国产拍免费91在线| 国产亚洲精品美女久久久| 性欧美另类高清| 中文字幕一区二区无码成人| 色色婷| 99re综合伊人| 色欲日韩欧美在线一区| 精品熟妇视频一区二区| 一区二区娱乐网站| 国产日本顶级一区二区三区| 激情小说五月天| 激情欧美97| 看日韩美女二区三区免费操逼视频| 熟女少妇一区二区三区| 69人妻精品一区二区绯色| 婷婷激情丁香| 中文字幕亚洲在线一区| 激情综合 婷婷五月 红杏 | 色播综合| 欧美日韩传媒| 9精品在线| 亚洲欧洲自拍图片专区满春格| 国产SV一线| 女欧美一区二三区| 日本不卡免费二区| 久草国产在线视频| 哈哈操 大香蕉| 91站街按摩店老熟女熟女| 国产91专区| 久久综合av| 91动漫操逼视频| 超碰97伊人| 五月天成人综合| 少妇淫妇久久久久久久| 久久精品一区| 久久五月视频| 无码不卡八戒| 午夜福利 成人 91| 色综合中文字幕不卡| 九九视频黄色片| 久久女同性恋一二区| 家庭乱伦网站国产| 亚洲欧美另类小说| 极品久久久久久久久久久久久久| 欧美亚洲日本激情在线| 久久精品店| 性性欧美| 天堂av2019| 蜜乳视频网站| 青草精品视频一日本久久久久网站| 久久精品毛片免费不卡| 日韩欧美传媒一区国产| 久久妇| 台欧久久精品视频| 国产精品久久久久无码AV会牛| 99少妇| 日韩资源网| 欧美日韩高潮喷水91| 一本色道久久天天射天天干| 加勒比99999| 久久大线蕉一区| 日本久久天堂| 操国产逼| 五月天婷婷在线看| 天美av在线| 日本最新免费韩国1区2区视频播放| 色噜噜人妻丝袜a∨先锋影 | 淫荡少妇免费| 亚洲阿v天堂在线| 久久精品99久久久久久| 婷婷色综合| 狠狠爱大香蕉| 黄色一区三区| 中文字幕成人| 岛国大片在线观看网站入口| 国产女s强制榨精视频| 搡老女人老91妇女老熟女| 超碰午夜在线| 秋霞视频一区二区| 中日亚韩免费视频| 国产精品一区二区a| 一本色道久久综合亚洲二区三区| 色爽——AV| 最新中文字幕av| 九九热在线视频| 视频分类 国内精品| 国产h片在线观看视频| 成人免费视瓶| 欧美亚洲国产91在线| 人妻三级在线中文字幕| 亚洲系列欧美| 亚洲欧洲精品成人| 天天天天天天天天综合| 九九九久千久久激情蜜桃在线看 | 久操网址| 乱伦3P视频| 密乳AV免费观看| 国产成人99久久亚洲综合| 一区二区高清视频| 国产女同在线观看视频| 99亚洲精品| 成人影院永久免费观看网址| 乱伦a片视频| 一级片在线观看高清无码| 中文字幕日韩电影人妻| 国产精品久久久久中文字幕| 久久精品亚洲成a人天堂| 2018天天干在线视频| 另类小说综合网| 中文字幕人成乱码熟女香港| 377p欧洲日本亚洲大胆| 激情视频网址| 欧美天天拍| 中文字幕乱碼在线| 综合情欲网| 亚洲se电影| 久久久不卡| 精品人妻一区二区三区四区石在线 | 91在线免费精品视频| 欧美BT 亚洲色图| 欧洲人妻视频| 欧美成人性爱视频在线播放| 欧美劲爆视频一区二区| 日韩精品区二区三区不卡| 极品五月天噜噜| 爱欲AV| 亚洲无限观看| 2017,超碰| 色欲av国内精品久久久久久| 久久riav中文精品| 亚洲熟妇自偷自拍另欧美| 国产怡红院| 97bbn| 91亚洲综合在线| 久久av无码| 黑人精品成人一区二区三区 | 天天日天天舔| 欧美日本不卡| 国产综合色精品在线观看| 岛国视频免费在线观看| 欧美久久九九| 97精选久久| 超碰色图| 日韩丝袜二区| 天天日天天射天天干| 99热导航| 欧美色www亚洲国产阿娇要播| 强奸乱伦资源| 综合久欧洲| AV有码在线| 超碰人妻天天干| 九九热精品免费视频| 啊啊啊啊啊舒服| 激情在线青青操| 亚洲精品影视老司机| 黄色AV影视| 久久精品六区| 一区二区三区探花在线观看| 日日干夜夜干| 亚洲综合网91| 亚洲国产高清福利视频| 狠狠躁久久躁| 国产最火爆久久国产网站网站| 男人的天堂2019AV| 久艹日日日| 激情久久av一区av二区av| 久久久久网站-538在线视频-欧美永久乱码| 欧美人妻制服| 久久婷婷综合国际产色怕| 啊操爽品善一区二区三区| 女生久久网| 五月天激情小说网| 91伊人| 99热超碰在线| 本道综合精品| 9久超碰| 欧美综合另类| 色嘟嘟人妻天堂网| 欧美天天弄| 久9热| 国产精品久久久亚洲第一牛牛_在线观看| 人妻精品视频一区二区三区| 67914亚洲精品| 男人的天堂va在线| 4141514逼喷水三级片| 日本一级性爱| 91久久久老司机| 亚洲国产精品有声| 久久久性少妇| 久久久久9999| 国产精品久久久吖| 99热导航| 老司机射| 欧美色蜜桃97| 免费夜夜爱黄色视频毛片| 青青草中出视频| 婷婷五月色| 97天天摸天天爽| 99热超碰| 亚洲,日韩,欧美,成人播放| 欧美视频第二页| 性爱边摸边日免费AV| 日本中文字幕一区| 大香蕉五月天| 亚洲在饯| 制服丝袜第二页| 国产又爽又黄| 17c嫩草51久久91嫩草| 久草综合京东| 日韩卡一卡二卡三在线| 熟妇色99| 久9久9精品| 亚洲AV麻豆Aⅴ无码电影一| 人妻在线中出视频| 男人天堂网站| 亚洲人在线| 色黄污美女啪啪啪免费网站| 综合av影片| 抽插无码高清一区| 免费人成在线观看网站品爱网| 99在线观看视频在线高清| 麻豆影音天美视频| 啪啪啪综合网| 91人妻尻屄视频| 操碰97| 福利五区| 诱惑人妻欧美一区在线播放| 亚洲欧美国产其他二区| 99久久精品欧美国产| wuyechaopeng| 夜夜騷av、一區二區| 新版天堂中文资源8在线| 日日插夜夜| 国产又黄又爽| 国产熟妇 码视频户外直播| 夜夜黄| 欧美高潮| 激情综合网一盗摄| 国产免费久久精品99re韩国| 亚洲91网。| 91亚·色| 九九九九久久久| 狠狠综合网| 午夜电影在线观看无码专区| 99久久e免费热视| 牛牛AV人人夜夜澡人人爽| 亚洲欧美碰碰| 久久春色| 欧美色女人| 欧美日韩在线小说| 亚州色综合| 1024精品在线| 国产日本一区二区三区蜜臀在线观看| 九九精品网| 97日韩欧美亚洲| 91激情国产| 久久久久久久9最新免费视频观看| 香蕉人欧美综合| 另类欧美色| 精品国产乱码久久久A| 九九九九精品在线| 91亚洲情色| 97国产超碰| 久久久久久久九九九九| 一起草三级AV电影在线观看| 日韩有码 一区二区三区| 欧美国产精品久久九九| 久久性生大片免费观看性| 亚洲欧美日韩中文播放| 日韩日本欧美在线观看| 久久黄片国产一区二区| 日本性爱不卡视频| 一本道综合色图| 国产最新AV| 亚洲天堂另类美腿| 性性久久| 亚洲欧美在线丝袜| 激情熟女12P| 亚洲国产奇米影视久久| 大香蕉综合在线| 97天天摸天天碰| 中文字幕片| 久久婷婷欧美| 久久久一区二区三区麻豆| 日躁天天爽爽| 中文字幕91页| www.色五月| 玖玖爱综合| 亚洲欲| 久久在肏| 日韩卡一卡二卡三在线| 人人操av| 久干网| 97鸡把在线视频| 亚洲中文字幕精品一区| 亚洲欧洲综合视频在线| 少妇极品熟妇人妻无码| 亚洲Av诱惑| 91深夜夜| 9久久9综合| 蜜桃精品一区二区三区久在线| 欧美东京热青青草| 思思热影视| 91亚州日韩高清| 加勒比伊人综合| 久操免费观看| 色色五月婷| 国产天美传媒精品| 色婷婷一区二区三区久久| 国产91啪| 9999亚洲电影| 日韩一级久久毛片| 亚洲人成网www| 在线亚洲丝袜视频网站| 黄色香蕉视频网站一区| 超碰日本97美女人妻人人玩人人爱| 日本好吊色视频| 天天看夜夜看日日干| 一级A啪啪啪啪| 9长久久精品| 亚欧无码线免费观看视频| 亚洲色诱惑| 久久啊啊啊视频| 2023天天操夜夜操| 国产欧美美女免费观看视频| 欧美黄片欧美黄片xxx| 久久久久久久久久久久久久久性生活视频 | 精品女同一区二区三区| 黄色AAAAAAAAAAA大片| 亚洲国产一区二区三区在线| 起碰97| 99热色精品| 欧美丰满少妇交换91欧美精品| 高潮毛片无遮挡高清免费| 嗯嗯嗯,草死我| 亚洲中文字幕在现观看| 99国产精品人妻人伦| 600国产精品视频| 丁香婷婷大香蕉| KK色在线影院| 五月天激情国产综合婷婷婷| 欧美97网| 水澄无码AV| 久久青青草在线视频| 丁香五月婷婷基地| 中国人高清www色视频免费| 欧美拳交在线播放| 国产免费一区2区3区| 大香蕉碰碰| 啊啊啊啊啊啊在线观看| 亚洲一二三精品久久网 | 欧美 亚洲 综合 制服| 超碰2017| 欧美 日韩 另类 亚洲| 在线岛国新天堂8| 美腿丝袜高跟网免费视频免费视频| 三级日韩一区二区三区| 久久一本大香蕉 | 亚洲图片欧美91N| 欧美色综合| 亚洲人在线| 乱伦色图网址是多少| 蜜臀久久久| 手机在线看片免费人成视频| 久久久精精精| 久久9精品视频| 久久亚洲中文字幕视频| 男人精品天堂一区| 99精品网| 日韩中文字幕视频| 色天天野狼综合社区| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 欧美天天在线| 欧美成人都市人妻| 亚洲无无码αⅴ每日更新| 日本淫穴在线| 可以看的av| 国产亚洲福利第一页丝袜| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 色女网日韩| 十八禁的黄污污免费网站| 欧美综色欧| 亚洲精品一二三四区| 久久成人国产| 啊啊啊想要| 欲女人妻性色av| 久久午夜伦| 久久的网站啊啊啊啊啊| 精品国产乱码久久久久久口爆网站| 撸无码不卡免费视频| 国产人伦精品一区二区三区 | 九九九久久久W精品| 九九十八精品| 玖玖婷婷五月天| 久久久久久久九九九九九九| 992大香蕉| 91nbbbbbb| 精品射1999| 九九aV| 欧美日韩国产三级黄色| 国产高清成人免费视频| 啊啊啊轻点在线观看| 99天天超碰| 亚洲男人天堂2019| 国产超碰人人操| 91精品微拍福利| 91丨人妻丨国产丨丝袜| 日日97| 日韩精品大香蕉伊人在线| 久久免费中文字幕在线观看| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 性猛交| 久久久久久久久女黄| 国内操逼视频二区| 台湾佬中文娱乐自偷自拍| 九九热精品| 精品成人av一区二区三区在线| 91露脸熟女专区| 中文字幕熟女人妻丝袜| 巨乳特殊服务按摩| 91亚洲丝袜熟女| 啊啊啊不要嗯嗯在线观看| 亚洲美女30b| 第45页一区二区| 香一区二区三区| 色噜噜综合在线| 嗯嗯啊中文字幕| 亚洲高潮少妇| 最新加勒比丝袜在线| 激情五月婷婷| 亚洲色天堂日韩中| 亚洲天堂性爱| 天天亚洲综合| 中文字幕-区二区三区四区视频中国| 免费视频在线观看啊啊啊啊啊| 欧美后进式| 夜夜嗨AV一区天天| 刺激性视频黄页| 天天日日本| 日日日啊啊啊| 久久精品视频28| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 天天性射网| 色综九九九一区| 亚洲天堂中文字| 在线国产福利网址导航| 殴美大黄片| 日本中文字幕在线视频| 丁香五月综合| 天天弄欧美| 欧美性综合| 久久青娱乐| 人人操人人肉久久精品| 蜜臀无码视频在线观看| 欧美色视频在线| 丰满的三级少妇欧美久久久| 欧美日韩高潮喷水91| 欧美激情 日韩精品| 日韩中文字幕2020| 国产丁香精品露脸视频| 国产精品九九九| 最新av中文字幕高清| 男人a天堂手机在线版| www超碰| 欧美三级一级| 另类专区加勒比| 777超碰| 强奸乱伦大香蕉| 五月婷婷无码| 日韩9999| 极品尤物女神在线观看| 老女人日韩美91| 加勒比久久综合网高清| 亚洲色图 91| 91 国产丝袜在线放观看| 亚洲欧美日韩制服另类| 色妇91| 狠狠色婷婷777| 老熟女乱伦一区| 欧亚韩国999| 青青草在线视频人人想人人上 | 精品国产99999| 天天欧美欧美亚洲网| 又粗又长又爽在线观看| 天天网综合| 嗯嗯啊啊的视频| 久久手机好看网站| 丝袜熟女一区二区三区| 欧美性爱精品七区| 亚洲另类春色| 日本道人妻久久久在线不卡色视频| 97色诱| 激情五月婷婷| 免费黄色片子| 中文字幕精品日韩中文字幕| 少妇熟女1区2区3区| 992大香蕉| 国产少妇内射| 精品白丝一区| 91女优在线观看| 青娱乐手机日韩在线视频| 96AV精品| 夜夜嗨AV蜜臀av| 亚洲色天堂日韩中| 神马久久久久眼| 99热免费| 大鸡吧尹人在线| 青青11操操操操操操操操| 大香蕉伊人色偷偷在线| 97久久超碰| 香蕉综合网| 清柠毛片| 久久有碼| 超碰9 7女人| 混色激情av| 天天爱天天操| 久久久97| 老司机午夜福利视频一区二区| 强奸乱伦av电影| 美女爽爽爽刺痛洞洞| 亚洲性爱无码乱伦av| 黄色AV影视| 97热视频在线观看| 拍拍拍拍大尺度黄色三级片拍拍拍拍拍照| 国产精品97超碰| 国产亚洲99久久精品熟| 国产高清成人mv在线观看| 中文字幕一区二区韩| 亚洲AV乱码专区国产噜噜亚洲| 夜夜综合| 97人妻免费中文字幕| 少妇精品久久久| 黄色AAAAA欧美| AV99热18这里只有精品| 在线观看色视频| 国产不卡的视频| 最新国产精品久久精品| www.91视频网| 三级片大波波| 亚洲精品人妻在线| 亚洲天天天| 黑丝少妇在线观看| 强被迫伦姧在线观看无码网站| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 404操逼福利视频| 精品无码一区二区三区| 欧美激情五月天| 亚洲爽图| 少妇内射www在线观看视频| 亚洲午夜福利在线影院| 欧美性爱一区二区三区| 台湾佬中文娱乐自偷自拍| 人妻少妇被猛烈进入中| 超碰九九| 老熟女熟妇| 偷看洗澡一二三区美女| 婷婷色综合欧美日韩| 伦在线97| 免费观看有码高清视频| 欧美精品一区二区少妇免费A片| 欧美青青草视频| 国产一区96在线| 波多野结衣一级视频| 日韩欧美中文字幕搭讪巨乳美人妻视频| 淫淫总合网| 国语精品内射在线观看| 亚洲男人的天堂va亚洲男人社| oumeisetu综合| 亚洲熟女性高潮久久久| 狠狠躁伊人中文字幕| 亚洲免费97免费| 婷婷色网| 十八禁的黄污污免费网站| 超清中文乱码字幕| 日本道日本道中文字幕日本道最新日本道在线观看| 超碰精品| 国产伦乱91| 国产午夜在线观看| 婷婷九月丁香| 情色五月天久久久| 综合影院亚洲| 天天做日日爱夜夜爽| 国产在线视频二区| 97爱综合| 精品人妻15区| 天天综合网~91综合网| 亚洲人在线成线成人| 成人黑料社久久| 亚州免费啪啪视频| 大屁股人妻女教师撅着屁股| 亚洲男人天堂2017| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 中文字幕成人| 91成人久久| 国产黄色小视频网站| 久久啊啊啊| 久久宗合97| 999 久久久| 99re9这里只有精品| 思思热在线| 亚洲精品日日夜夜52| 国产一区在线观看无码AV| 深夜福利黄片| 亚洲天天操| 亚洲人妻精品一区二区| 97在线播放 | 国产精品 久久久精品一牛| 夫妻天天操岛国视频| 新怡红院| 精品国产乱码久久久影院| 色老牛| 99re69综合| 伊人青青一区成人视频在线观看区| 婷婷五月天激情四射| 日韩不卡a级视频专区| 精品视频免费在线一区| 强奸乱伦免费网站| 一级AV性爱| 色哟哟AⅤ| 国产亚洲性生活视频播放| 91精品国产91久久福利| 黄色无码高清黄色无码网站| 亚洲一区二区在线观看91| 久热伊人| 中文乱码字幕观看| 亚洲色婷婷久久久综合日本| 久操免费观看| 精品视频在线观看| 久久久久久久免费A片国产成a人亚洲精∨品无码 | 97超碰色中文字幕| 日韩人妻一区二区| 蜜臀一区二区三区在线| 天天日天天干天天操| 成人精品无码| 精品久久久久久中文字幕三区| 国产黄色影片在线观看| 国产白嫩漂亮KTV在线| 操我无码| 1024人妻| 国产自产91区13区| 精品人妻一区二区乱码一区二区 | 欧美精品成人在线播放| 首页中文字幕中文字幕免费| 日韩一级免费性爱| 五月丁香六月婷| 久久久久久久久久久久久久9999| 超碰97在线 欧美 国产| 国产亚洲精品美女| 欧美图片校园春色| 欧美成人性活片| 豆花视频操逼网址| 国产精品岛国片在线观看| 婷婷久久综合| 午夜精品久久久久久久99热影院| 热的中文 热的有码 热的国产| 久久激情视频| 人人么人人操| 精品国产www久久| 亚洲美女精品| 草B在线| 国产多人在线观看视频| 久久亚洲av成人无码国产| 97 亚洲 日韩 欧美 在线| 丝袜色综合| 韩国免费播放一级毛片| 无码乱人伦中文视频| 色婷婷aV一区二区三区麻豆综合| 日本道日本道中文字幕日本道最新日本道在线观看 | 日韩91网站| 中文字幕乱在线伦视频中文字幕乱码在线 | 午夜天堂精品久久久久91| 亚洲少妇激情视频| 欧美懂色综合网| 亚洲四虎熟女精品| 久久久久亚洲精品| 欧美一级在线观看成人| 久久老子无码午夜伦不卡| 日日黄色三级网站| 亚洲福利影院一区久久| 综合色图区| 91欧美巨乳| 天天插夜夜操| 蜜臀精品1区2区| 91中文字幕制服丝袜免费视频| 18禁网站在线播放| 超碰 av 女人天堂| 中英熟女操女| 日韩乱码av| 夜夜欧美 | 欧美天天在线| 狠狠操夜夜| 热久久99999| 一区AV| 97超碰色五月| 91成人无码| 99热在线观看| 久久99国产精品| 99热18| aV中文麻| 99精彩视频| 亚洲激情久久久伊人综合| 92午夜免费福利视频| 蜜臀th| 秋霞免费AV| 亚洲丰满很很操| 亚洲AV性爱电影| 伊人精品国产| 家庭乱伦网站国产| 蜜臀一二三区| 国产激情综合五月久久| 中文字幕第二页| 超碰av在线| 亚洲成人ab| 夂久色| 大JI巴好深好爽又大又粗视频| 国产乱码久久| 97啪啪| 三上制服丝AV| 精品午夜福利国产一区二区在线观看| 国产熟妇一区二区| 成人三一级一片aaa| 精品中文一区二区| 牛黄色久午久| 蜜臀AV午夜精品久| 久久久噜噜噜久久久| 久久av无码| 另类视频在线| 亚洲图片欧美在线视频| 偷拍盗拍亚洲色图图片| 精品人人| 激情五月天插| 黑白配性爱AV成| 天天欧美色| 小日子操bb在线看| 中文字幕免费看| 色综合超碰超| 久操婷婷| 国产精品不卡av免费在线观看| 日韩情色AV| 国产三级电影免费观看| 欧美在线天堂| 国产AV人人 夜夜人人澡| 成人性爱美曰韩| 神马麻豆福利院| 樱花草社区www中国| 精品伊人久久久大香线蕉小说| 操熟女91| 国产白丝在线| 色色五月天婷婷| 国产91av在线播放| 久久久久九九九九九| 欧美激情总合网| 国产一级操B视频| 中文字幕一区二区三区50路| 丝袜视频一区二区在线播放国产中文| 久久免费精品视频免一| 免费试看60秒| 欧美日韩97在线| 肥臀熟女福利视频一区二区| 日逼国产| 无码精品久久久久久亚洲| 激情久久日韩精品中文字幕麻豆| 蜜桃视频精品一区二区| 操逼无码一区| 日本精品一级二级三级| 国产91丝袜在线播放蜜月| 91黑丝少妇| 99人人干| 日韩A优精品在线观看| 国产精品人妻无码久久久老鸭窝| 伊人96在线| 久插综合| 久久这里都是精品| 国产激情视频在线观看| 久久久亚洲Av| 大香蕉一级黄色片久久| 天天肏夜夜肏| 9999久久久久| 欧美日动态视频| 精品无码一区二区| 九九av| 黄色一级视| 日本 色 导航| 性色av大全| 人妻天天爽天天爽三区| 精品少妇99| 久久久久久无码人妻中文字幕| 人妻熟女一区二区三区在线| 久妇网| 色嘟嘟人妻天堂网| 婷婷五月天基地| 欧美黄色大香蕉一区二区| 人人操人人操人人操人人操人人操人人人11.CM | 大黄片做爱的大的| 黑人精品一区二区在线播放| 久久午夜色播影院免费高清| 欧美色九九| 日日躁天天躁狠狠躁| 人乳av| 欧美亚洲韩国视频十五区| 久久久久久久久久久久久久久久9| 亚洲人精品久久久喷水| 人人喜人人妻| 久久一区无码| 夜夜操老骚逼视频网站| 嗯啊免费视频| 青青草在线视频人人想人人上 | 亚洲最新Av| 伊人一级免费黄片| AV乱伦专区| 日韩免费av片高清无码| 边做饭边操逼逼| 色综合一本| 精品国产91内射久久| 无码外流操逼视频| 亚洲欧洲中文日韩女优乱码| 亚洲乱色熟女一区| 琪琪精品免费一区二区三区| 日本日逼高清| 国产三级日产三级韩国三级| 久久鲁干| 99无码视频| 中文字幕一区 二 区 三 四 五 区日 日 骚| 婷婷五月天网| 男人天堂站| 人妻人人澡人人爽人人| 亚洲电影91| 91大香蕉伊人| 亚州91| 久久精品国内Av熟女高清| 久久性爱精品一区| 3D污黄视频在线观看| 精品国产肉丝袜在线拍国语| 91大学精品激情戏| 欧美性战999| 日日干夜夜欢| 久久久日本电影| 91P0RNY大屁股人妻| 亚洲小电影免费涩涩成人在线高清| 久久精品国产亚洲AV片多多 | 亚洲黄色AV电影| 国产一区二区三区高清视频| 日韩乱伦AⅤ| 亚洲欧洲综合视频在线| 91在线美女| 午夜福利在线合集| 96久久久久久久| 中字幕人妻一区二区三区| 九月丁香综合网| 性欧美另类高清| 少妇色综合| 九九热国产| 精品毛片av一区二区| 欧美一级色| 久久综合女优| 日韩97超碰| 九九视频黄色片| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 成人精品在线| 色月天AV导航| 九九九九一级| 秋霞Av理论一级在线| 亚洲操逼无码| 99国产在线绯色一区| 综合大香蕉美。| 韩国三级一线观看久| 韩国黄色片精品久久久| 亚洲免费97免费| juliaann欧美丝袜办公室| 性久久| 91美女在线精品视频| 中文字幕免费在线观看| ji熟女.com| 老女人爆菊| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 日本孕妇一区二区视频操逼免费看 | 久久精品99| 狠狠做深爱婷婷久久二区| 天天干人人看综合| 五月天激情小说| 九九人妻| 97在线精品观看视频| 啊啊啊啊啊在线观看网址| 黄页网站成人免费| 国产精品无码av在线| 亚洲综合影片| 天美传媒精品一区二区| 色99视频| 五十路熟女在线不卡观看一区二区| 美女视频尤物网在线看| 婷婷三区| 97超碰久久| 玖玖综合.com| 超碰久超碰久| 五月婷婷AV| 天操天操夜操夜月操月年年操操| 香蕉热人人精品| 亚洲黄日韩无码专区| 探花精品 一区二区| 午夜天堂精品久久久久91| 淫纸中9区| 97碰在线视频| 久久久女人| 狠狠综合网| 99热这里只有精品1| 玖玖资源综合在线视频| 人妻无码视频一区二区三区久久| 加勒比在线观看一区二区| 天天综合香 ld视频| 2018天天日天天日| 亚洲 图片 欧美 色图| 美女天天干| 亚洲蜜臀懂色| 无码一区二区精品视频久久久春药| 一道本东京热加勒比一区二区三区| 久久久久9999| 69AV女优男人的天堂| 无码久久亚洲高清,| 中文字幕少妇色| 强奸乱伦AV网址| 精品九九九九九九九九九| 天天干天天燥| 啊啊啊不要嗯嗯在线观看| www国产天美久久久| 天天碰久久入| 日本三级中国三级99人妇网站| 97天天| 97激情97激情| 色色香蕉| 久久精品成人| 后入美女国产| 一个人免费视频观看在线WWW| 天天综合欧美综合| 伊人网综合在线视频| 舔人妻中文免费视频| 婷婷亚洲色| 肏逼视频日本| 亚州高清色综合| 综合色啪| 国产乱伦视频污| jiujiujiujingpin| 国产高潮AA片免费看| 五月天亚洲色图| 伊人991| 国产成人精品日本亚洲语言| 国产综合久久久麻桃个| 亚洲天堂自拍| 国产AV超爽| 四虎精品永久在线播放| 丝袜av一区二区三区| 婷婷九月色| 欧美成人A√在线一区二区| 国产一| 欧美亚洲性爱一区二区| 国产精品呦一区二区三区| 欧美偷拍| 欧美亚洲AN| 欧美色色色| 亚洲国产ⅴ高清在线观看| 噜噜噜噜天天狠狠| 综合网亚| www.久久| 国产精品免费日韩| 91精品国产一区三一| 亚拍在线| 国产九九久久久精品| 东亚亚洲无码高清| 亚洲欧美日韩免费观看| 国产91丝袜在线播放蜜月| 天天干2区3区| 色综合色欲色综合色综合色综合| 中文字幕蜜乳av| 大色网久久| 热久日综合| 99久久无色码| 再深点灬舒服灬太大了好硬好爽| 可以免费看黄片的视频| 久操国产在线| 中文无线日韩一区| 人妻一区久久二区三区色播| 99热这里只有精品99| 亚洲成人无码影院| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 午夜福利视频在线一区| 亚洲精品国语在线播放| 狠狠色色| 国产精品熟女AV中文字幕在线播放| 脫衣舞一区二区三区| 91操熟女| 国产sv美女内射| 久九9精品| 中文字幕久久精品一区| 91老司机在线视频免费观看| 97人人操人人干| 日本国产高清色www视频在线| a片在线播放| 国产精品香蕉| sewuyueav| 亚洲 欧美 日韩另类 麻豆| 无码久| 操一区| 欧美亚州综合图片| 97天天做| 天堂麻豆天美| 夜夜高潮夜夜爽| 久久久久精| 激情综合97| www.婷婷| 日韩人妻少妇 一区二区三区| 性爱1区| 欧美日韩第一页| 人妻熟女av国产网站| 日本一本道A级黄色毛片试看60分钟| www.91逼逼.com| 九九干| 久久久免费的精品| 久久久久国产精品喷潮免费观看臀| 亚洲精品人妻在线| 51一区二区三区| 天天做日日爱夜夜爽| 第一高清av中文字幕| 女人爽到高潮潮喷18禁网站| 国产福利第一视频| 成人av免费观看| 欧洲色色| 97国产精品国| 亚洲黄日韩无码专区| 精品一区二区麻豆| 国产精品久久久久久久久久久久久久久| 日韩ab网 | 国产精品不卡av免费在线观看| 中文字幕三四区| 日本爽爽爽爽爽爽免费视频| 在线观看一级α片刺激高潮视频|