整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          阿銳分享Spring依賴注入

          阿銳分享Spring依賴注入

          、Spring簡介

          1.Spring簡化Java開發

          Spring Framework是一個應用框架,框架一般是半成品,我們在框架的基礎上可以不用每個項目自己實現架構、基礎設施和常用功能性組件,而是可以專注業務邏輯。因此學習Spring Framework在架構和模式方面的結構和原理,對我們在架構和模塊級別的理解幫助極大。Spring Framework(參考1)的宗旨是簡化Java開發,主要的手段如下:

          (1)在架構上解耦:通過DI(依賴注入)管理類型依賴,通過AOP分離關注點,減少重復代碼。

          (2)在設計上廣泛采用DIP(依賴倒置)和ISP(接口隔離)等原則和Facade(外觀)等模式:提供簡化的調用接口并封裝了眾多出色的第三方組件。

          (3)在語言層面上采用注解:通過配置文件和Annotation(參考.NET Attribute)簡化應用配置。

          2.Spring Framework的架構和模塊:

          Spring Framework本身的架構是典型的松散分層,外層可以按需引用全部內層,內層不能引用外層。Spring的基礎組件如下圖所示:

          從圖中可以看出,開始的模塊只有從core\beans\aop\context四個組件,后來添加了context-support【1.2】擴展模塊、expression【3.0】擴展模塊和beans-groovy【4.0】擴展模塊。

          Spring上述模塊的基礎上,內建和封裝了眾多的實用的通用組件,主要的組件如圖所示:

          從圖中可以看出,spring-oxm、spring-jdbc和spring-web是眾多模塊依賴的核心,spring-oxm提供了Object和XML的映射支持。

          二、基礎知識

          1.DIP:DIP(依賴倒置原則)是DI(依賴注入)的核心(參考2)。

          (1)高層模塊不應該依賴于低層模塊。兩者都應該依賴于抽象。

          (2)抽象不應該依賴于細節。細節應該依賴于抽象。

          說人話就是:將對具體類的引用轉換成對其接口的引用,具體類只引用接口(引用==依賴,接口==接口或抽象類)。事實上我們調用具體類的時候在頭腦里也是只關心其提供的API而非實現,DIP則通過在設計和重構階段在技術手段上保證了解耦。

          2.DI:DI(依賴注入)讓我們不必手寫工廠代碼來管理接口和實現類的映射、對象的創建和生命周期的管理。

          (1)接口注入:必須實現特定的接口才可以,侵入性太強,現在已經無人關心和使用。

          (2)構造函數注入:依賴體現在構造函數的參數上。

          (3)屬性注入:依賴體現在屬性上。

          由于在實現時,可以將類型注冊為自己的兼容類型,這樣依賴注入就可以直接替代new實例化對象,這樣理解和使用依賴注入工具還不如不使用或手寫工廠了。依賴注入工具在實現時肯定會實現成一個支持不同配置和不同生命周期的對象工廠,但即使沒有提供一套添加依賴倒置原則限制的API,也不意味著我們把它當成new的替代品。如同映射工具雖然在實現時可以任意映射,但不是用來取代賦值的,而是用來處理領域實體和視圖模型等有實際對應關系的對象之間的映射。

          (1)依賴配置:依賴配置是依賴注入實現的基礎。依賴注入工具都至少支持代碼配置和文件配置。Java中可以通過Annotation(.NET中通過Attribute)簡化配置。

          (2)對象工廠:根據配置返回一個或多個對象。這是核心功能。

          (3)生命周期管理:一般提供至少4種級別的支持:作用域、單例、線程、HTTP請求范圍。

          大多數依賴注入工具在支持依賴倒置原則的基礎上,在技術手段上實現了更多的功能,如類型的兼容轉換、對依賴命名、在配置時直接傳入對象等。

          三、Spring依賴注入的要點

          Bean在Spring中就是POJO(.NET的POCO)。

          Spring依賴注入需要掌握的核心是3個類型BeanDefinition、BeanFactory和ApplicationContext。

          1.BeanFactory

          BeanFactory是spring中依賴注入的核心接口,其設計主要采用了ISP(接口隔離原則),通過多層次的接口繼承即保證了單個接口的內聚又保證了整個體系的簡潔。這里我們要關注的核心是DefaultListableBeanFactory。

          如圖所示,查看XmlBeanFactory代碼,可以看到XmlBeanFactory只是通過XmlBeanDefinitionReader載入了BeanDefinition配置,XmlBeanDefinitionReader負責將配置解析到BeanDefinition。DefaultListableBeanFactory是真正的實現類,其中定義了類型為Map<String, BeanDefinition>的beanDefinitionMap列表用于存儲依賴配置。#p#分頁標題#e#

          2.BeanDefinition:

          BeanDefinition定義了配置元數據,無論使用java code、xml、Annotation還是Groovy腳本方式,不同的配置方式通過不同的BeanDefinitionReader解析為BeanDefinition。

          3.ApplicationContext

          ApplicationContext的核心都是將對象工廠功能委托給BeanFactory的實現類DefaultListableBeanFactory。目前最常用的是基于注解的AnnotationConfigApplicationContext和AnnotationConfigWebApplicationContext。

          四、Spring依賴注入快速上手

          1.使用Java配置代替xml配置

          Java配置的核心是@Configuration和@Bean。定義生命周期使用@Scope,需要引入其他配置文件時使用@Import。

          (1)@Configuration:應用了@Configuration注解的POCO成為了配置類。相當于xml配置文件。

          (2)@Bean:配置類中應用了@Bean注解的方法成為了配置項。相當于xml中的Bean節點。

          package me.test.spring_ioc;

          import org.springframework.context.annotation.AnnotationConfigApplicationContext;

          import org.springframework.context.annotation.Bean;

          import org.springframework.context.annotation.Configuration;

          public class App {

          public static void main(String[] args) {

          AnnotationConfigApplicationContext container=new AnnotationConfigApplicationContext(AppConfig.class);

          String message=container.getBean(IAppService.class).Test();

          System.out.println(message);

          container.close();

          }

          }

          @Configuration

          class AppConfig {

          @Bean

          public IAppService IAppService() {

          return new AppService(new Repository<SimpleEntity>());

          }

          }

          class SimpleEntity {

          private String name;

          public String getName() {

          return name;

          }

          public void setName(String name) {

          this.name=name;

          }

          }

          interface IAppService {

          String Test();

          }

          interface IRepository<T> {

          String Test();

          }

          class AppService implements IAppService {

          private IRepository<SimpleEntity> _repo;

          public AppService(IRepository<SimpleEntity> repo) {

          _repo=repo;

          }

          @Override

          public String Test() {

          return this._repo.Test();

          }

          }

          class Repository<T> implements IRepository<T> {

          @Override

          public String Test() {

          return this.getClass().getName();

          }

          }

          #p#分頁標題#e#

          如果是Web應用程序,應該使用AnnotationConfigWebApplicationContext,在JSP中可通過WebApplicationContextUtils獲取ApplicationContext對象。

          <%@page import="swp.IAppService"%>

          <%@page import="org.springframework.web.context.WebApplicationContext"%>

          <%@page

          import=" org.springframework.web.context.support.WebApplicationContextUtils"%>

          <html>

          <body>

          <%

          WebApplicationContext context=WebApplicationContextUtils

          .getRequiredWebApplicationContext(this.getServletContext());

          String message=context.getBean(IAppService.class).print();

          out.print(message);

          %>

          </body>

          </html>

          2.基于Annotation的自動裝配

          自動裝配主要使用@ComponentScan、@Component和@Autowired。

          (1)@ComponentScan:作用在配置類上,啟用組件掃描。掃描并注冊標注了@Component(@Controller\@Service\@Repository)的類型。@Configuration已經應用了@Component注解。

          (2)@Autowired:按類型自動裝配。@Autowired和使用@Inject(JSR-330)或@Resource(JSR-250)的效果是類似的。@Autowired和@Inject默認按類型注入,@Resource默認按名稱注入。

          package me.test.spring_ioc;

          import org.springframework.beans.factory.annotation.Autowired;

          import org.springframework.context.annotation.AnnotationConfigApplicationContext;

          import org.springframework.context.annotation.Bean;

          import org.springframework.context.annotation.ComponentScan;

          import org.springframework.context.annotation.Configuration;

          import org.springframework.stereotype.Component;

          public class App {

          public static void main(String[] args) {

          AnnotationConfigApplicationContext container=new AnnotationConfigApplicationContext(AppConfig.class);

          String message=container.getBean(IAppService.class).Test();

          System.out.println(message);

          container.close();

          }

          }

          @Configuration

          @ComponentScan

          class AppConfig {

          /*@Bean

          public IAppService IAppService() {

          return new AppService(new Repository<SimpleEntity>());

          }*/

          }

          class SimpleEntity {

          private String name;

          public String getName() {

          return name;

          }

          public void setName(String name) {

          this.name=name;

          }

          }

          interface IAppService {

          String Test();

          }

          interface IRepository<T> {

          String Test();

          }

          @Component

          class AppService implements IAppService {

          private IRepository<SimpleEntity> _repo;

          @Autowired

          public AppService(IRepository<SimpleEntity> repo) {

          _repo=repo;

          }

          @Override

          public String Test() {

          return this._repo.Test();

          }

          }

          @Component

          class Repository<T> implements IRepository<T> {

          @Override

          public String Test() {

          return this.getClass().getName();

          }

          }

          #p#分頁標題#e#

          小結:

          你至少應該知道的:

          (1)BeanFactory和BeanDefinition

          (2)DefaultListableBeanFactory和ApplicationContext

          (3)AnnotationConfigApplicationContext和AnnotationConfigWebApplicationContext

          (4)@Configuraton和@Bean

          Spring的依賴注入在配置上是基于對象而不是類型,最先支持的是xml而不是注解,到現在也沒有比較方便的代碼配置機制。雖然現在已經從xml過渡到了注解方式,但基于對象的基礎仍然是影響很多方面的缺點。

          前在手機微信瀏覽器中打開的 H5 頁面,是無法通過 JavaScript 的 API 實現圖片或文件下載的。

          為什么在手機的默認瀏覽器就可以下載,但我們在微信里面打開瀏覽器,就下不了了呢?

          我覺得是微信 APP 的權限問題,下載的權限是掌握在當前使用的 APP 手上的。微信拒絕了內置瀏覽器的下載文件請求,即使瀏覽器自身有對應的下載 API,但你就是下載不了。

          微信為什么這么做?是因為怕以前常見的瀏覽器彈窗廣告一樣的情況出現。如果對圖片下載權限不做限制的話,很多搞營銷的就會誘導用戶打開一些網頁,然后自動下載一些廣告宣傳圖片之類的東西。

          但長按圖片保存還是可以的。

          但也不是完全沒辦法,微信還是提供了一些 API 來實現 受限 的下載功能。

          使用微信的 JS-SDK

          我們可以使用微信提供的 JS-SDK 去和微信通信,獲得一些手機系統的能力。

          官方說法為:

          微信JS-SDK是微信公眾平臺面向網頁開發者提供的基于微信內的網頁開發工具包。

          用法就是在頁面引入這個 jssdk 的 js 文件,然后你就能拿到一個 wx 的對象。然后調用 config 方法,傳入 appId、簽名等信息(這個需要在微信公眾號平臺獲取)。之后我們就可以通過 wx 對象的方法去和微信通信,使用手機系統的能力。

          其中有個 wx.downloadImage() 的方法,是用來下載圖片的。但其實我覺得應該是用來耍猴的。

          該方法不接受一個 url 參數,而是接受一個 serverId。

          serverId 從哪來,從另一個方法 wx.uploadImage() 里面獲得。wx.uploadImage() 方法用于上傳本地的圖片,但上傳成功后,回調函數就能拿到一個 serverId。

          上傳到哪?微信自己的服務器。如果你想保存到自己公司的服務器,你還得讓公司服務器調用多媒體接口,從微信服務器拿回圖片。而且,微信服務器只給你保存 3 天時間

          是的,你能下載的圖片的圖片來自用戶的上傳,且只有三天有效期。另外,下載的圖片貌似也不會保存到相冊里,而是保存在用戶找不到的地方。

          結論就是完全沒法用。

          微信小程序

          小程序提供了一個簡單、高效的應用開發框架和豐富的組件及API,幫助開發者在微信中開發具有原生 APP 體驗的服務。

          微信小程序算不上是 H5,因為它是微信下的原生程序,只是語法上類似網頁開發的那一套。

          微信小程序的 Hello World 項目模板的入口文件為下面代碼。

          // app.ts
          App<IAppOption>({
            globalData: {},
            onLaunch() {
              // 展示本地存儲能力
              const logs=wx.getStorageSync('logs') || []
              logs.unshift(Date.now())
              wx.setStorageSync('logs', logs)
          
              // 登錄
              wx.login({
                success: res=> {
                  console.log(res.code)        
                  // 發送 res.code 到后臺換取 openId, sessionKey, unionId
                },
              })
            },
          })
          

          可以看到,這里同樣有一個 wx 對象。

          但需要注意的是,這個 wx 對象和 JS-SDK 的 wx 是完全不同的東西,千萬別混為一談。

          調用 wx.downloadFile() 方法并傳入一個 url 就能下載文件。但有一些限制,比如單次下載大小最大為 200 MB、只能訪問開發設置配置好的指定域名、域名需 ICP 備案等。

          下載的文件會保存在一個本地臨時路徑。如果是圖片,可以再調用 wx.saveImageToPhotosAlbum() 方法保存到相冊。

          講了半天,這個微信小程序也不是 H5 啊,如果我的微信小程序通過 web-view 元素嵌入了一個 H5 頁面,那我這個 H5 頁面是不是會更牛逼一點,是不是可以用小程序的 wx 對象啊。

          不行。

          盡管是內嵌的 H5 頁面,但其實它和小程序是隔離的,小程序內嵌的 H5 頁面其實和普通的 H5 頁面沒有區別,還是得用傻不拉幾的 JS-SDK。

          講這么多,主要是想讓大家認識到:wx.downloadFile() 是微信小程序才能使用的,不可以用到 H5 上,即使這個 H5 是內嵌到小程序里的。

          話說回來,為什么微信小程序的能力要比 JS-SDK 受到的限制小很多呢?

          我認為是因為開發者開發的微信小程序是受到微信監管的,發布也需要通過微信的審核,微信也有權限將任何小程序下架。

          所以微信不怕小程序開發者濫用功能,抓到了直接就給你封了。而用 H5 頁面則是完全開放的,

          那么方案是?

          首先,微信瀏覽器中的 H5 頁面,我們無法讓用戶通過點擊 “下載” 按鈕來下載圖片、視頻以及文檔文件(pdf、word 等),而是打開一個新的頁面讓你預覽。

          但對于其他微信不能預覽的文件(如果 zip 壓縮包)來說,則會將其下載下來。

          但是對于展示出來的圖片,用戶可以長按圖片保存下來。

          所以我們的常規方案是:

          首先要判斷瀏覽器是否為微信瀏覽器,如果不是微信瀏覽器,下載保持原來邏輯。

          如果是圖片,點擊下載按鈕時彈出彈窗,提示用戶長按圖片下載;

          如果是視頻或文檔文件,提示用戶使用默認瀏覽器去下載文件??紤]到用戶用新的瀏覽器又要登陸很麻煩,引導用戶點擊右上角將鏈接用默認瀏覽器打開并不是好方案。

          我們可以在點擊下載按鈕時,復制文件鏈接,然后讓用戶自行打開默認瀏覽器粘貼鏈接下載。這種占用用戶剪貼板的行為其實不太好。

          或者直接將下載按鈕屏蔽掉算了,又或是彈出只能在 PC 端下載的提示。

          如果是其他類型文件,倒是可以下載。

          結尾

          今天講了微信瀏覽器不能下載圖片的一些原因,誤解和解決方案,希望對你有所幫助。

          我是前端西瓜哥,歡迎關注我。

          應用經濟和數字化經濟并生的潮流下,通過數字化轉型加強數字創新能力、提升市場競爭力勢在必行。敏捷為數字化轉型提供了一個出色的框架。


          The Open Group《發布時刻》系列網絡研討會重磅發布了開放敏捷架構相關的《O-AA?安全手冊》指南《訂單到回款——流程輪胎行業領域驅動設計案例研究》


          活動邀請到天邦股份CIO姚凱老師,以及翌擎智能科技咨詢部經理劉亮老師進行正式發布和解讀,從發布物本身切入,與大家一起了解如何有效利用開放敏捷架構助力數字化企業轉型。同時,對案例的研究也將助力推動對標準的理解,也為最佳實踐提供指引。


          本期發布物



          無論探討何種敏捷架構,都離不開“安全”這個關鍵詞,其中,最小安全架構(MSA)是敏捷開發的關鍵要素。不僅要將安全性在最一開始就構建在架構中,同時還必須通過不需要大量前期規劃的定期反饋循環快速響應、必須考慮到遠超出當前架構的未來狀態。


          本指南因此提出了需要遵循的三個核心理念:

          • 敏捷安全架構必須在短而快速的周期內構建。
          • 安全架構的任何變化都必須應用于每個團隊的環境。
          • 安全架構師和衛士將確保任何架構符合組織預先定義的風險偏好。


          對此,架構師、特別是敏捷安全架構師所應當扮演的角色、所應該履行的職責都是什么,在本文第二章進行了詳細說明。如何能淋漓盡致發揮上述職責、而不是每次都“重新發明輪子”,從而實現敏捷安全架構治理,詳見指南第三章?!懊艚莅踩軜嫀煴仨毰c負責風險管理的業務組織以及解決方案的功能用戶”共同組成團隊,方能一展身手。第四章、第五章則分別從架構安全的特征(即,特別針對安全方面的策略與控制措施)、作為制品的敏捷安全架構(即,其所含內容與質量屬性)兩方面進行了闡述。



          本案例研究基于米其林的真實案例(兩位作者同樣來自該公司),聚集于這一輪胎生產企業的訂單到回款流程,體現了在數字化轉型的大背景環境下、領域驅動設計(DDD)和事件風暴是如何發揮實際作用的。


          作者們在其實際工作中發現:一方面,單體系統不足以靈活適應流程的局部優化;另一方面,即便引入業務流程管理(BPM)工具作為“中央編排器”,但幾年后,編排器本身也會出現故障、反而變成了另一種單體,其維護也日漸難以為繼。


          此時,DDD成為了重構架構的好方法:通過定義領域邊界、開啟事件風暴(并在描述依賴關系時使用戰略集成模式、體現上下文映射)、識別業務事件、深入實施細節、描述邊界上下文等五個主要步驟,將從訂單到回款領域清晰而完整地展現出來。


          發布嘉賓

          獲得中歐國際工商學院MBA學位,持有CISA、CISM、CGEIT、CRISC、CISSP、CCSP、CSSLP、CEH、CIPT、CIPM、CIPP/US和EXIN DPO等認證?,F任天邦食品有限公司CIO職務,負責IT戰略規劃、政策程序制定、IT架構設計及數字化推進工作。是ISACA、(ISC)2和IAPP協會的會員。


          “數字化轉型更多指戰略和運營模式的改變,利用技術進步改善人類體驗和運營效率,并發展客戶將保持忠誠的產品和服務。數字企業指的是具有以下特征的企業:創建完全數字化交付的數字化產品或服務;客戶通過數字方式獲得實物產品和服務。敏捷安全架構必須在短而快速的周期內構建;安全架構的任何變化都必須應用于每個團隊的環境;確保任何架構符合組織預先定義的風險偏好。”


          在汽車數字化方面經驗豐富,始終活躍在奧迪中國市場敏捷轉型的一線。他專注于變革時代的創新企業數字化架構設計、開發和管理,以確保價值符合不斷進取的業務場景。作為數字服務提供商的背景和敏捷方面的經驗,他始終堅持從業務和用戶出發,讓數據助力營銷,軟件賦能汽車。


          “以業務服務為起點,通過業務服務識別限界上下文,同時,對業務服務進行細化,編寫包含領域知識的業務服務規約。這屬于領域驅動設計統一過程的全局分析階段。進入架構映射階段??梢酝ㄟ^業務服務識別限界上下文,使用界限上下文畫布可清晰列出了領域實體或值對象(“統一語言”)和 “業務決策”(規則、策略和決策),然后在此基礎上,得到各個限界上下文的服務契約,包括服務契約的定義,確定上下文映射關系。由此進入領域建模階段。”


          通過與在線觀眾的互動問答,兩位老師的解答幫助大家對“敏捷安全架構”以及“領域驅動設計“主題有了更加清晰的理解:


          Q1:敏捷安全架構與傳統安全架構的區別是什么?

          姚凱:敏捷安全架構是對傳統安全架構在敏捷環境下的優化。傳統安全架構的部署可以認為是瀑布式的,需求事先確認,然后根據需求完成設計、實施,整個流程周期比較長,期間任何變更都比較難于直接實現。敏捷安全架構引入了MSA的概念,可以先提供最小的安全架構,滿足基本的要求,而后在這個基礎上逐步迭代和加強,這樣這個安全體系的響應速度大為加強。同時,敏捷安全架構可以與更有效地沖刺和MVP集成,不至于造成安全性能的過度或不足。敏捷安全架構與敏捷開發有效融合,在DevOps的每個環節,都融入了安全要素和活動。


          Q2:安全架構與信息系統架構如何融合?

          姚凱:從TOGAF?標準的觀點來說,我們是從業務架構出發,推導出信息系統架構,在往下到數據架構、技術架構和安全架構的。當然,TOGAF?標準也指出了,這個次序不是一成不變的。

          安全需求同樣來源于業務。因此,我們必須從業務出發,了解組織對風險的態度,并結合具體的業務,識別可能存在的風險點,在去檢查我們的信息系統架構,看看在哪些位置有針對性的增強。比方,我們做一個電商系統,存在的風險點可能有注冊環節的個人信息,有商品展示環節的價格被篡改,下單環境的“薅羊毛”,支付環節的資金安全等等。針對其中的某些關注點,我們可以檢查信息系統架構設計,有沒有緩解相應的威脅,比方個人信息的通知和對同意的存儲,存儲的個人信息類型等等。基于這些設計和我們的安全要求,在某些環節進行加強,并把這個需求傳導到技術架構,例如要求數據加密存儲,個人信息進行混淆等等。最后,從整體看,信息系統架構中已經包含了安全的內容,就像一個建筑設計圖,單獨有建筑設計、結構設計、水電、暖通,但合在一起又是彼此融為一體的。


          Q3:應用端到端的流程梳理的優勢和劣勢分別是什么?

          劉亮:通過事件風暴梳理端到端的流程是架構規劃里面常見的方法。優勢顯而易見,包括可有效梳理及可視化業務流程和架構;利于可視化管理業務流程的變更;為未來IT業務和目標架構也提供更好的方向。

          但任何事物都有正收益和負收益。負收益方面,具體體現在清晰的流程可能會使得業務和IT產生路徑依賴,不利于顛覆式創新,所以我們需要定期反思和回顧流程和架構。


          Q4:可以展開講述上下文畫布的應用嗎?

          劉亮:上下文畫布廣泛應用在敏捷開發和架構的多個方面,是一個戰略和戰術的結合工具。通過這個工具,有助于把相關的元素、信息進行有序的整合。這里我們說的限界上下文畫布,將幫助我們把領域的上下文信息、關系、屬性進行集中式模塊化的展現,是個設計和文檔類的工具。


          主站蜘蛛池模板: 久久久精品人妻一区亚美研究所| 99精品久久精品一区二区| 少妇无码一区二区三区| 国产精品高清一区二区人妖| 国产成人无码AV一区二区| 成人毛片一区二区| 无码人妻精品一区二区| 久久精品无码一区二区三区不卡| 曰韩精品无码一区二区三区| 色屁屁一区二区三区视频国产| 无码人妻一区二区三区免费看| 亚洲av无码天堂一区二区三区 | 精品不卡一区中文字幕| 无码精品黑人一区二区三区| 搜日本一区二区三区免费高清视频| 麻豆国产一区二区在线观看| 国产一区二区在线| 国产一区在线mmai| 精品少妇ay一区二区三区| 日本一区二区三区免费高清在线| 人妻无码一区二区三区AV| 伊人久久大香线蕉av一区| 毛片一区二区三区| 国产suv精品一区二区6| 久久精品黄AA片一区二区三区| 熟妇人妻一区二区三区四区| 福利一区福利二区| 男人免费视频一区二区在线观看| 性色av无码免费一区二区三区| 日本一区二区三区爆乳| 亚洲AV日韩综合一区尤物| 精品香蕉一区二区三区| 中文字幕AV一区二区三区人妻少妇 | 国产激情无码一区二区| 国产免费一区二区视频| 国产人妖视频一区二区| 日韩亚洲一区二区三区| 亚洲av鲁丝一区二区三区| 亚洲一区动漫卡通在线播放| 久久精品免费一区二区| 亚洲国产成人久久一区二区三区|