精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一文了解和 Spring Bean 有關的那些注解

開發 開發工具
隨著Spring的流行,我們經歷過基于XML-Based 的配置,隨著SpringBoot的流行,我們逐漸使用基于注解的配置替換掉了基于XML-Based的配置,那么你知道基于注解的配置的基礎組件都是什么嗎?

隨著Spring的流行,我們經歷過基于XML-Based 的配置,隨著SpringBoot的流行,我們逐漸使用基于注解的配置替換掉了基于XML-Based的配置,那么你知道基于注解的配置的基礎組件都是什么嗎?都包括哪些要素?那么本節就來探討一下。注:本篇文章更多的是討論Spring基于注解的配置一覽,具體的技術可能沒有那么深,請各位大佬見諒。

[[269373]]

探討主題:

  • 基礎概念:@Bean 和 @Configuration
  • 使用AnnotationConfigApplicationContext 實例化Spring容器
  • 使用@Bean 注解
  • 使用@Configuration 注解
  • 編寫基于Java的配置
  • Bean定義配置文件
  • PropertySource 抽象類
  • 使用@PropertySource
  • 占位符的聲明

基礎概念:@Bean 和 @Configuration

Spring中新的概念是支持@Bean注解 和 @Configuration 注解的類。@Bean 注解用來表明一個方法實例化,配置并且通過IOC容器初始化并管理一個新的對象。@Bean注解就等同于XML-Based中的標簽,并且扮演了相同的作用。你可以使用基于注解的配置@Bean 和 @Component,然而他們都用在@Configuration配置類中。

使用@Configuration 注解的主要作用是作為bean定義的類,進一步來說,@Configuration注解的類允許通過調用同類中的其他@Bean標注的方法來定義bean之間依賴關系。如下所示:

新建一個maven項目(我一般都直接創建SpringBoot項目,比較省事),創建AppConfig,MyService,MyServiceImpl類,代碼如下:

  1. @Configuration 
  2. public class AppConfig { 
  3.  
  4.     @Bean 
  5.     public MyService myService(){ 
  6.         return new MyServiceImpl(); 
  7.     } 
  8.  
  9. public interface MyService {} 
  10. public class MyServiceImpl implements MyService {} 

上述的依賴關系等同于XML-Based:

  1. <beans> 
  2.     <bean id="myService",class="com.spring.annotation.service.impl.MyServiceImpl"/> 
  3. </beans> 

使用AnnotationConfigApplicationContext 實例化Spring容器

AnnotationConfigApplicationContext 基于注解的上下文是Spring3.0 新添加的注解,它是ApplicationContext的一個具體實現,它可以接收@Configuration注解的類作為輸入參數,還能接收使用JSR-330元注解的普通@Component類。

當提供了@Configuration 類作為輸入參數時,@Configuration類就會注冊作為bean的定義信息并且所有聲明@Bean的方法也都會作為bean的定義信息。

當提供@Component和JSR-330 聲明的類時,他們都會注冊作為bean的定義信息,并且假設在必要時在這些類中使用諸如@Autowired或@Inject之類的注解

簡單的構造

在某些基于XML-Based的配置,我們想獲取上下文容器使用ClassPathXmlApplicationContext,現在你能夠使用@Configuration 類來實例化AnnotationConfigApplicationContext。

在MyService中添加一個printMessage()方法,實現類實現對應的方法。新建測試類進行測試

  1. public class ApplicationTests { 
  2.  
  3.     public static void main(String[] args) { 
  4.         ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); 
  5.         MyService service = context.getBean(MyService.class); 
  6.           // printMessage() 輸出something... 
  7.         service.printMessage(); 
  8.     } 

如前所述,AnnotationConfigApplicationContext不僅限于使用@Configuration類。任何@Component或JSR-330帶注釋的類都可以作為輸入提供給構造函數,如下例所示

  1. public class ApplicationTests { 
  2.  
  3.     public static void main(String[] args) { 
  4.         ApplicationContext context = new AnnotationConfigApplicationContext(MyServiceImpl.class,Dependency1.class,Dependency2.class); 
  5.         MyService myService = context.getBean(MyService.class); 
  6.         myService.printMessage(); 
  7.     } 

使用register注冊IOC容器

你可以實例化AnnotationConfigApplicationContext通過使用無參數的構造器并且使用register方法進行注冊,它和AnnotationConfigApplicationContext帶參數的構造器起到的效果相同。

  1. public class ApplicationTests { 
  2.  
  3.     public static void main(String[] args) { 
  4.         AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); 
  5.         ctx.register(AppConfig.class, OtherConfig.class); 
  6.         ctx.register(AdditionalConfig.class); 
  7.         ctx.refresh(); 
  8.         MyService myService = ctx.getBean(MyService.class); 
  9.         System.out.println(ctx.getBean(OtherConfig.class)); 
  10.         System.out.println(ctx.getBean(AdditionalConfig.class)); 
  11.         myService.printMessage(); 
  12.     } 

OtherConfig.class 和 AdditionalConfig.class 是使用@Component 標注的類。

允許scan()方法進行組件掃描

為了允許組件進行掃描,需要在@Configuration配置類添加@ComponentScan()注解,改造之前的AdditionalConfig類,如下:

  1. @Configuration 
  2. @ComponentScan(basePackages = "com.spring.annotation.config"
  3. public class AdditionalConfig {} 

@ComponentScan指定了基礎掃描包位于com.spring.annotation.config下,所有位于該包范圍內的bean都會被注冊進來,交由Spring管理。它就等同于基于XML-Based的注解:

  1. <beans> 
  2.     <context:component-scan base-package="com.spring.annotation.config/> 
  3. </beans> 

AnnotationConfigApplicationContext中的scan()方法以允許相同的組件掃描功能,如以下示例所示:

  1. public static void main(String[] args) { 
  2.   AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); 
  3.   ctx.scan("com.spring.annotation"); 
  4.   ctx.refresh(); 
  5.   MyService myService = ctx.getBean(MyService.class); 

為什么說@Configuration用法和@Component都能夠標注配置類?因為@Configuration的元注解就是@Component。

  1. @Target({ElementType.TYPE}) 
  2. @Retention(RetentionPolicy.RUNTIME) 
  3. @Documented 
  4. @Component 
  5. public @interface Configuration { 
  6. String value() default ""

使用AnnotationConfigWebApplicationContext支持web容器

AnnotationConfigApplicationContext的一個WebApplicationContext的變化是使用AnnotationConfigWebApplicationContext。配置Spring ContextLoaderListener的servlet監聽器,Spring MVC的DispatcherServlet等時,可以使用此實現。以下web.xml代碼段配置典型的Spring MVC Web應用程序(請注意context-param和init-param的使用)

  1. <web-app> 
  2.       <!-- 配置web上下文監聽器使用 AnnotationConfigWebApplicationContext 而不是默認的 
  3.         XmlWebApplicationContext --> 
  4.     <context-param> 
  5.         <param-name>contextClass</param-name
  6.         <param-value> 
  7.             org.springframework.web.context.support.AnnotationConfigWebApplicationContext 
  8.         </param-value> 
  9.     </context-param> 
  10.  
  11.       <!-- 配置位置必須包含一個或多個以逗號或空格分隔的完全限定的@Configuration類。 也可以為組件掃描指定完全           限定的包--> 
  12.     <context-param> 
  13.         <param-name>contextConfigLocation</param-name
  14.         <param-value>com.spring.annotation.config.AdditionalConfig</param-value> 
  15.     </context-param> 
  16.  
  17.       <!--使用ContextLoaderListener像往常一樣引導根應用程序上下文--> 
  18.     <listener> 
  19.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
  20.     </listener> 
  21.  
  22.       <!-- 定義一個SpringMVC 核心控制器 DispatcherServlet--> 
  23.     <servlet> 
  24.         <servlet-name>dispatcher</servlet-name
  25.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
  26.         <!-- 配置web上下文監聽器使用 AnnotationConfigWebApplicationContext 而不是默認的 
  27.                 XmlWebApplicationContext --> 
  28.         <init-param> 
  29.             <param-name>contextClass</param-name
  30.             <param-value> 
  31.                 org.springframework.web.context.support.AnnotationConfigWebApplicationContext 
  32.             </param-value> 
  33.         </init-param> 
  34.         <!-- 配置位置必須包含一個或多個以逗號或空格分隔的完全限定的@Configuration類。 也可以為組件掃描指定                    完全限定的包--> 
  35.         <init-param> 
  36.             <param-name>contextConfigLocation</param-name
  37.             <param-value>com.spring.annotation.config.MvcConfig</param-value> 
  38.         </init-param> 
  39.     </servlet> 
  40.  
  41.     <!-- 將/app/* 的所有請求映射到調度程序servlet --> 
  42.     <servlet-mapping> 
  43.         <servlet-name>dispatcher</servlet-name
  44.         <url-pattern>/app/*</url-pattern> 
  45.     </servlet-mapping> 
  46. </web-app> 

使用@Bean注解

@Bean 注解是一個方法級別的注解,能夠替換XML-Based中的標簽,@Bean注解同樣支持標簽支持的屬性,像是 init-method, destroy-method, autowiring。

定義一個Bean

與基礎概念中Bean的定義相同,讀者可以參考基礎概念部分進行了解,我們不在此再進行探討。

Bean的依賴

@Bean 注解可以有任意數量的參數來構建其依賴項,例如

  1. public class MyService { 
  2.     private final MyRepository myRepository; 
  3.     public MyService(MyRepository myRepository) { 
  4.         this.myRepository = myRepository; 
  5.     } 
  6.     public String generateSomeString() { 
  7.         return myRepository.findString() + "-from-MyService"
  8.     } 
  9.  
  10. @Configuration 
  11. class MyConfiguration { 
  12.     @Bean 
  13.     public MyService myService() { 
  14.         return new MyService(myRepository()); 
  15.     } 
  16.     @Bean 
  17.     public MyRepository myRepository() { 
  18.         return new MyRepository(); 
  19.     } 
  20.  
  21. public class MyRepository { 
  22.     public String findString() { 
  23.         return "some-string"
  24.     } 

接受生命周期回調

任何使用@Bean的注解都支持生命周期的回調,使用JSR-220提供的@PostConstruct和@PreDestory注解來實現。如果bean實現了InitializingBean,DisposableBean或者Lifecycle接口,他們的方法會由IOC容器回調。一些以Aware的實現接口(像是BeanFactoryAware,BeanNameAware, MessageSourceAware, ApplicationContextAware等)也支持回調。

@Bean注解支持特定的初始化和銷毀方法,就像XML-Based中的init-method和 destory-method中的bean屬性,下面這個例子證實了這一點

  1. @Configuration 
  2. public class AppConfig { 
  3.  
  4.     @Bean(initMethod = "init"
  5.     public BeanOne beanOne(){ 
  6.         return new BeanOne(); 
  7.     } 
  8.  
  9.     @Bean(destroyMethod = "cleanup"
  10.     public BeanTwo beanTwo(){ 
  11.         return new BeanTwo(); 
  12.     } 
  13.  
  14. class BeanOne { 
  15.     public void init(){} 
  16.  
  17. class BeanTwo { 
  18.     public void cleanup(){} 

對于上面的例子,也可以手動調用init()方法,與上面的initMethod 方法等效

  1. @Bean 
  2. public BeanOne beanOne(){ 
  3.   BeanOne beanOne = new BeanOne(); 
  4.   beanOne.init(); 
  5.   return beanOne; 

當你直接使用Java開發時,你可以使用對象執行任何操作,并且不必總是依賴于容器生命周期。

Bean的作用范圍

Spring包括@Scope注解能夠讓你指定Bean的作用范圍,Bean的Scope默認是單例的,也就是說@Bean標注的對象在IOC的容器中只有一個。你可以重寫@Scope的作用范圍,下面的例子說明了這一點,修改OtherConfig如下

  1. @Configuration 
  2. public class OtherConfig { 
  3.  
  4.     @Bean 
  5.     @Scope("prototype"
  6.     public Dependency1 dependency1(){ 
  7.         return new Dependency1(); 
  8.     } 

每次嘗試獲取dependency1這個對象的時候都會重新生成一個新的對象實例。下面是Scope的作用范圍和解釋:

@Scope和Scoped-proxy

Spring提供了一種通過scoped proxies與scoped依賴一起作用的方式。最簡單的在XML環境中創建代理的方式是通過標簽。使用@Scope注解為在Java中配置bean提供了與proxyMode屬性相同的功能。默認是不需要代理的(ScopedProxyMode.NO),但是你需要指定ScopedProxyMode.TARGET_CLASS或者ScopedProxyMode.INTERFACES。

自定義Bean名稱

默認的情況下,配置類通過@Bean配置的默認名稱(方法名***個字母小寫)進行注冊和使用,但是你可以更換@Bean的name為你想指定的名稱。修改AdditionalConfig 類

  1. @Configuration 
  2. //@ComponentScan(basePackages = "com.spring.annotation.config"
  3. public class AdditionalConfig { 
  4.  
  5.     @Bean(name = "default"
  6.     public Dependency2 dependency2(){ 
  7.         return new Dependency2(); 
  8.     } 

Bean的別名

有時候需要為單例的bean提供多個名稱,也叫做Bean的別名。Bean注解的name屬性接收一個Array數組。下面這個例子證實了這一點:

  1. @Configuration 
  2. public class OtherConfig { 
  3.  
  4. //    @Bean 
  5. //    @Scope("prototype"
  6. //    public Dependency1 dependency1(){ 
  7. //        return new Dependency1(); 
  8. //    } 
  9.  
  10.         @Bean({"dataSource""dataSourceA""dataSourceB"}) 
  11.     public DataSource dataSource(){ 
  12.             return null
  13.     } 

Bean的描述

有時,提供更詳細的bean描述信息會很有幫助(但是開發很少使用到)。為了增加一個對@Bean的描述,你需要使用到@Description注解

  1. @Configuration 
  2. public class OtherConfig { 
  3.  
  4. //    @Bean 
  5. //    @Scope("prototype"
  6. //    public Dependency1 dependency1(){ 
  7. //        return new Dependency1(); 
  8. //    } 
  9.  
  10. //    @Bean({"dataSource""dataSourceA""dataSourceB"}) 
  11. //    public DataSource dataSource(){ 
  12. //        return null
  13. //    } 
  14.  
  15.     @Bean 
  16.     @Description("此方法的bean名稱為dependency1"
  17.     public Dependency1 dependency1(){ 
  18.         return new Dependency1(); 
  19.     } 

使用@Configuration注解

已經把@Configuration的注解說明的比較詳細了。

組成Java-Based環境配置的條件

Spring基于注解的配置能夠允許你自定義注解,同時能夠降低配置的復雜性。

使用@Import注解

就像在Spring XML文件中使用元素來幫助模塊化配置一樣,@Import 注解允許從另一個配置類加載@Bean定義,如下所示

  1. @Configuration 
  2. public class ConfigA { 
  3.  
  4.     @Bean 
  5.     public A a(){ 
  6.         return new A(); 
  7.     } 
  8.  
  9. @Configuration 
  10. @Import(ConfigA.class) 
  11. public class ConfigB { 
  12.  
  13.     @Bean 
  14.     public B b(){ 
  15.         return new B(); 
  16.     } 

現在,在實例化上下文時,不需要同時指定ConfigA.class 和 ConfigB.class ,只需要顯示提供ConfigB

  1. public static void main(String[] args) { 
  2.     ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigB.class); 
  3.  
  4.     A a = ctx.getBean(A.class); 
  5.     B b = ctx.getBean(B.class); 

這種方法簡化了容器實例化,因為只需要處理一個類,而不是要求你在構造期間記住可能大量的@Configuration類

有選擇性的包含@Configuration 類和@Bean 方法

選擇性的允許或者禁止@Configuration注解的類和@Bean注解的方法是很有用的,基于一些任意系統狀態。一個常見的例子是只有在Spring環境中啟用了特定的配置文件時才使用@Profile注釋激活bean。

@Profile注解也實現了更靈活的注解@Conditional,@Conditional 注解表明在注冊@Bean 之前應參考特定的Condition實現。

實現Condition接口就會提供一個matched方法返回true或者false

更多關于@Conditional 的示例,請參考https://www.cnblogs.com/cxuanBlog/p/10960575.html

結合Java與XML配置

Spring @Configuration類能夠100%替換XML配置,但一些工具(如XML命名空間)仍舊是配置容器的***方法,在這種背景下,使用XML使很方便的而且使剛需了。你有兩個選擇:使用以XML配置實例化容器為中心,例如:ClassPathXmlApplicationContext導入XML或者實例化以Java配置為中心的AnnotationConfigApplicationContext并提供ImportResource注解導入需要的XML配置。

將@Configuration聲明為普通的bean元素

請記住,@Configuration類存放的是容器中的bean定義信息,下面的例子中,我們將會創建一個@Configuration類并且加載了外部xml配置。下面展示了一個普通的Java配置類

  1. @Configuration 
  2. public class AppConfig { 
  3.  
  4.     @Autowired 
  5.     private DataSource dataSource; 
  6.  
  7.     @Bean 
  8.     public AccountRepository accountRepository() { 
  9.         return new JdbcAccountRepository(dataSource); 
  10.     } 
  11.  
  12.     @Bean 
  13.     public TransferService transferService() { 
  14.         return new TransferService(accountRepository()); 
  15.     } 

下面是system-test-config.xml配置類的一部分

  1. <beans> 
  2.  
  3.       <!--允許開啟 @Autowired 或者 @Configuration--> 
  4.     <context:annotation-config/> 
  5.  
  6.          <!-- 讀取外部屬性文件 --> 
  7.       <!-- 更多關于屬性讀取的資料,參考 https://www.cnblogs.com/cxuanBlog/p/10927819.html --> 
  8.     <context:property-placeholder location="classpath:/com/spring/annotation/jdbc.properties"/> 
  9.  
  10.     <bean class="com.spring.annotation.config.AppConfig"/> 
  11.  
  12.     <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource"
  13.           <property name="driverClassName" value="${jdbc.driverClassName}" /> 
  14.         <property name="url" value="${jdbc.url}"/> 
  15.         <property name="username" value="${jdbc.username}"/> 
  16.         <property name="password" value="${jdbc.password}"/> 
  17.     </bean> 
  18. </beans> 

引入jdbc.properties建立數據庫連接

  1. jdbc.driverClassName=com.mysql.jdbc.Driver 
  2. jdbc.url=jdbc:mysql://localhost:3306/sys 
  3. jdbc.username=root 
  4. jdbc.password=123456 
  1. public static void main(String[] args) { 
  2.     ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:/com/spring/annotation/system-test-config.xml"); 
  3.     TransferService transferService = ctx.getBean(TransferService.class); 
  4.     // ... 

在system-test-config.xml中,AppConfig 對應的標簽沒有聲明id屬性,雖然這樣做是可以接受的,但是沒有必要,因為沒有其他bean引用它,并且不太可能通過名稱從容器中獲取它。同樣的,DataSource bean只是按類型自動裝配,因此不嚴格要求顯式的bean id。

使用<> 挑選指定的@Configuration類

因為@Configuration的原注解是@Component,所以@Configuration注解的類也能用于組件掃描,使用與前一個示例中描述的相同的方案,我們可以重新定義system-test-config.xml以利用組件掃描。請注意,在這種情況下,我們不需要顯式聲明<context:annotation-config />,因為<context:component-scan />啟用相同的功能。

  1. <beans> 
  2.  
  3.     <context:component-scan base-package="com.spring.annotation"/> 
  4.     <context:property-placeholder location="classpath:/com/spring/annotation/jdbc.properties"/> 
  5.  
  6.     <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource"
  7.           <property name="driverClassName" value="${jdbc.driverClassName}" /> 
  8.         <property name="url" value="${jdbc.url}"/> 
  9.         <property name="username" value="${jdbc.username}"/> 
  10.         <property name="password" value="${jdbc.password}"/> 
  11.     </bean> 
  12. </beans> 

@Configuration 類使用@ImportResource

在基于Java注解的配置類中,仍然可以使用少量的@ImportResource導入外部配置,***的方式就是兩者結合,下面展示了一下Java注解結合XML配置的示例

  1. @Configuration 
  2. @ImportResource("classpath:/com/spring/annotation/properties-config.xml"
  3. public class AppConfig { 
  4.  
  5.     @Value("${jdbc.driverClassName}"
  6.       private String driver; 
  7.  
  8.     @Value("${jdbc.url}"
  9.     private String url; 
  10.  
  11.     @Value("${jdbc.username}"
  12.     private String username; 
  13.  
  14.     @Value("${jdbc.password}"
  15.     private String password
  16.  
  17.     @Bean 
  18.     public DataSource dataSource() { 
  19.         return new DriverManagerDataSource(url, username, password); 
  20.     } 

Properties-config.xml

  1. <beans> 
  2.     <context:property-placeholder location="classpath:/com/spring/annotation/jdbc.properties"/> 
  3. </beans> 

jdbc.properties

  1. jdbc.driverClassName=com.mysql.jdbc.Driver 
  2. jdbc.url=jdbc:mysql://localhost:3306/sys 
  3. jdbc.username=root 
  4. jdbc.password=123456 
  1. public static void main(String[] args) { 
  2.     ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class); 
  3.     TransferService transferService = ctx.getBean(TransferService.class); 
  4.     // ... 
責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2023-11-08 08:15:48

服務監控Zipkin

2020-08-27 07:34:50

Zookeeper數據結構

2023-06-28 07:39:02

SeataTCC方案XA 方案

2024-02-01 11:57:31

this指針代碼C++

2023-12-29 15:28:18

磁盤固態硬盤

2023-11-20 08:18:49

Netty服務器

2023-04-26 15:43:24

容器編排容器編排工具

2019-10-12 08:59:36

軟件DevOps技術

2022-02-25 07:34:36

MQTT協議RabbitMQ

2023-11-06 08:16:19

APM系統運維

2022-11-11 19:09:13

架構

2022-06-08 08:11:56

威脅建模網絡安全網絡攻擊

2025-05-23 09:38:54

JWT開發Go

2023-11-22 16:10:59

編程語言機器語言

2022-09-19 07:33:17

Spring@Enable注解

2022-06-26 00:18:05

企業產品化變量

2022-10-28 13:48:24

Notebook數據開發機器學習

2023-12-26 07:33:45

Redis持久化COW

2024-01-19 11:53:29

文件系統操作系統存儲

2023-08-26 20:56:02

滑動窗口協議
點贊
收藏

51CTO技術棧公眾號

国产欧美在线| 九九色在线视频| 日韩精品国产精品| 久久精品国产欧美激情| 免费黄视频在线观看| 成人动漫一区| ●精品国产综合乱码久久久久| 91一区二区三区| 精品人妻无码一区二区性色| 欧美电影三区| 亚洲国产精品国自产拍av秋霞| 国产裸体免费无遮挡| 亚洲综合伊人久久大杳蕉| 91视频免费观看| 亚洲aaaaaa| 波多野结衣不卡| 欧美日韩国产成人精品| 在线观看国产欧美| 精品人妻一区二区三区浪潮在线| 91成人在线| 亚洲亚洲精品在线观看| 日韩激情视频| 国产99对白在线播放| 视频一区在线视频| 久久久久国产视频| 亚洲一区电影在线观看| 亚洲大片精品免费| 精品美女在线播放| 91精品视频国产| 色豆豆成人网| 黄网站免费在线播放| 色欧美自拍视频| 日韩精品免费综合视频在线播放 | 国产精品私拍pans大尺度在线 | 欧美与亚洲与日本直播| 亚洲人成精品久久久久久| 欧美色图亚洲自拍| 人人妻人人澡人人爽久久av| 蜜桃视频第一区免费观看| 久久久女女女女999久久| 欧美a级片免费看| 中日韩免视频上线全都免费| 亚洲国产精品久久久久| 在线观看一区二区三区视频| 亚洲一区二区av| 欧美日韩国产精品自在自线| 欧美 日韩精品| 手机在线观看av网站| 亚洲第一搞黄网站| 青青草视频在线视频| av毛片在线看| 亚洲视频1区2区| 成人免费看片视频在线观看| av网址在线看| 欧美亚洲一区二区三区四区| 亚洲aa中文字幕| 国产精品久久久午夜夜伦鲁鲁| 日本中文字幕一区二区视频 | 日韩漫画puputoon| 91久久人澡人人添人人爽欧美| www.av毛片| 老色鬼在线视频| 欧美日韩一区二区精品| 国产精品无码专区av在线播放| 中文不卡1区2区3区| 91福利视频在线| 中文字幕国产传媒| 欧美视频免费看| 91精品久久久久久久久99蜜臂 | 99re视频这里只有精品| 久久99国产精品99久久| 久久米奇亚洲| 国产精品免费观看视频| 日韩一级大片在线观看| wwwwwxxxx日本| 91麻豆精品国产综合久久久| 欧美成人一级视频| 三叶草欧洲码在线| 成久久久网站| 色综合久综合久久综合久鬼88 | 亚洲先锋成人| 青草成人免费视频| 一级片一区二区三区| 国产九色精品成人porny | 色综合久久中文| 中文字幕在线精品| 麻豆91精品91久久久| 国产精品久久久一区二区| 国产精品99久久久久久人| 国产伦精品一区二区三区免.费 | 超碰成人av| 欧美视频第二页| 成人做爰69片免费| 欧美中文字幕不卡| 日韩在线电影一区| 黄色网页在线免费观看| 黄色一区二区三区| 中文字幕第38页| 成人资源在线播放| 亚洲免费一在线| 99视频只有精品| 三级成人在线视频| 成人欧美一区二区三区视频| 黄色av网站在线| 一区二区在线观看视频在线观看| 国产又黄又大又粗视频| 亚洲一区二区三区久久久| 精品一区二区电影| 欧美黑人猛猛猛| 日本伊人午夜精品| 亚洲在线视频福利| 川上优的av在线一区二区| 亚洲五码中文字幕| 最新天堂在线视频| 免费av一区二区三区四区| 久久69精品久久久久久国产越南| 在线免费一区二区| 91影院在线观看| 国产av熟女一区二区三区| 国产精品99久久久久久董美香 | 亚洲最大激情中文字幕| 黄色片在线免费观看| 亚洲大尺度视频在线观看| 在线观看免费av网址| 蜜桃一区二区三区| 91国语精品自产拍在线观看性色 | 99久久99久久综合| 国产一级大片免费看| 欧美一区二区三区婷婷| 国产亚洲激情视频在线| 日韩特级黄色片| 成人亚洲一区二区一| 无码毛片aaa在线| 久久爱.com| 色哟哟入口国产精品| 精品人妻一区二区三区潮喷在线 | 黑人と日本人の交わりビデオ| 国产亚洲永久域名| 国产一区二区三区在线视频 | 亚洲欧美另类综合偷拍| 日本久久久精品视频| 91成人精品在线| 久热精品视频在线观看一区| 国产精品久久无码一三区| 国产精品天干天干在观线| 性欧美极品xxxx欧美一区二区| 免费精品国产的网站免费观看| 69av视频在线播放| 瑟瑟在线观看| 色狠狠一区二区| 亚洲ⅴ国产v天堂a无码二区| 日韩成人午夜电影| 亚洲国产激情一区二区三区| www.一区| 久久人体大胆视频| 国产手机视频在线| 一区二区三区欧美亚洲| 久久久久久中文| 性猛交富婆╳xxx乱大交天津| 一区二区在线免费| 老司机午夜免费福利| 国产欧美日韩综合一区在线播放 | 在线观看免费黄网站| 日韩黄色大片网站| 91在线精品视频| 国产九九精品| 日韩欧美高清在线| 91视频免费在线看| 成人网在线免费视频| 青青草精品视频| 美女撒尿一区二区三区| 国产精品欧美综合亚洲| 亚洲少妇屁股交4| 久久久无码人妻精品无码| 亚洲高清二区| 久久精品国产一区二区三区不卡| 亚洲综合电影| 视频在线观看99| av中文在线观看| 精品成人乱色一区二区| 日本一区二区视频在线播放| 狠狠色狠狠色综合系列| 国产一区二区三区小说| 色综合久久中文| 国产在线观看91精品一区| 蜜臀av在线| 亚洲性无码av在线| 国内精品久久久久久久久久| 五月激情六月综合| 日本不卡一区视频| 波多野结衣中文一区| 杨幂毛片午夜性生毛片| 极品裸体白嫩激情啪啪国产精品| 日本成人黄色免费看| 日本伊人久久| 国产精品久久久久福利| 黑人极品ⅴideos精品欧美棵| 亚洲欧美日韩一区在线| www.com在线观看| 在线这里只有精品| 69精品久久久| 国产精品久久久久久久久晋中| av黄色一级片| 国内成人免费视频| 日本成人中文字幕在线| 日韩视频一区| 久久天天东北熟女毛茸茸| 少妇精品久久久| 国产一区二区不卡视频| 亚洲精品一区av| 热久久免费视频精品| 三级资源在线| 日韩在线观看免费av| 飘雪影视在线观看免费观看| 日韩欧美亚洲一区二区| 玖玖精品在线视频| 欧美3p视频在线观看| 日韩亚洲国产中文字幕欧美| 在线观看中文字幕av| 欧美777四色影视在线| 欧美精品一级二级三级| 久久久精品福利| 依依成人综合视频| 在线免费看av网站| 国产精品网站在线播放| 性欧美13一14内谢| 337p粉嫩大胆噜噜噜噜噜91av| 特黄特色免费视频| 国产高清精品网站| 九九久久久久久| 久国产精品韩国三级视频| 国产视频在线视频| 久久中文欧美| www黄色av| 久久精品一本| 国产成人精品视频免费看| 亚洲裸体俱乐部裸体舞表演av| 美女av免费观看| 重囗味另类老妇506070| 正在播放国产精品| 国产精品国产一区| 中文字幕第一页亚洲| 国产精品久久久久久久久久10秀| 一区二区精品国产| 午夜影院欧美| 99久re热视频精品98| 欧美在线影院| 人妻互换免费中文字幕| 欧美精品播放| 91免费黄视频| 久草在线网址| av午夜精品一区二区三区| 在线观看亚洲免费视频| 成人午夜短视频| 欧美在线一级片| 2020国产精品| 天天躁夜夜躁狠狠是什么心态| 中文字幕免费不卡| 91视频免费看片| 一区在线中文字幕| 麻豆亚洲av熟女国产一区二| 亚洲国产中文字幕| 亚洲男人的天堂在线视频| 色哟哟欧美精品| 中文字幕在线观看精品| 欧美美女一区二区三区| 亚洲国产精品久久人人爱潘金莲 | 成人性做爰aaa片免费看不忠| 丝袜a∨在线一区二区三区不卡| 成人在线激情网| 久久国产人妖系列| 国产亚洲精品成人a| 91啪亚洲精品| 99国产精品免费| 亚洲视频一区二区在线观看| 久久久久99精品| 欧美午夜精品理论片a级按摩| 99久久久无码国产精品免费| 亚洲国产三级网| 午夜在线观看视频| 欧美激情综合亚洲一二区| 中文字幕在线视频网站| 国产中文欧美精品| 欧美综合精品| 香蕉视频在线网址| 国产精品亚洲产品| 国产女同无遮挡互慰高潮91| 99久久国产免费看| 中文乱码字幕高清一区二区| 精品久久久精品| 亚洲熟妇无码久久精品| 精品国产精品网麻豆系列| 免费在线黄色网址| 久久91亚洲人成电影网站| 性欧美hd调教| 成人av免费看| 人人狠狠综合久久亚洲婷婷| 亚洲国产精品成人天堂| 精品中文字幕一区二区| 一区二区不卡免费视频| 亚洲欧美国产毛片在线| www.国产高清| 日韩欧美综合一区| 国产视频网址在线| 伊人成人网在线看| 中文字幕乱码一区二区三区| 99亚洲伊人久久精品影院红桃| 可以看污的网站| 久久蜜桃av一区精品变态类天堂| 国产精品老熟女一区二区| 欧美这里有精品| 欧美人体大胆444www| 欧美肥老妇视频| 日韩av黄色| 欧美日韩精品免费看| 一区在线播放| 曰本三级日本三级日本三级| 欧美国产禁国产网站cc| av大片免费在线观看| 日韩欧美成人激情| 国产传媒在线播放| 国产日韩在线观看av| 国产成人1区| 少妇高潮喷水久久久久久久久久| 国产成人一级电影| 视频国产在线观看| 国产成人精品亚洲777人妖 | 日韩欧美高清在线观看| 欧洲国内综合视频| 青青国产在线| 51视频国产精品一区二区| 99亚洲乱人伦aⅴ精品| 欧洲xxxxx| 国产老肥熟一区二区三区| 小早川怜子一区二区的演员表| 欧美猛男做受videos| www.激情网| 国产成人鲁色资源国产91色综| 日本精品人妻无码77777| 777久久久精品| 国产美女av在线| 91在线中文字幕| 欧美va亚洲va日韩∨a综合色| 99日在线视频| 亚洲欧美日本在线| 午夜老司机福利| 久久久久久亚洲精品不卡| 在线播放一区二区精品视频| 国产91在线亚洲| 成人精品视频一区二区三区| 国产精品2020| 亚洲精品黄网在线观看| 涩涩视频网站在线观看| 欧美福利精品| 青青草国产成人av片免费| 9.1片黄在线观看| 91麻豆精品91久久久久久清纯| av片在线观看| 国产精品一区而去| 国产亚洲永久域名| 亚洲欧美日韩第一页| 国语精品一区| 国产裸体视频网站| 亚洲成av人片一区二区梦乃| 日韩精品一二| 国产精品香蕉国产| 综合色一区二区| 不卡中文字幕av| 蜜臀av在线观看| 欧洲亚洲免费视频| 爽成人777777婷婷| 国产精品二区视频| 无码av中文一区二区三区桃花岛| 男男激情在线| 亚洲伊人久久综合| 国产亚洲亚洲| 小嫩苞一区二区三区| 精品88久久久久88久久久| 麻豆mv在线看| 亚洲图片在线观看| 成人美女在线视频| 中文字幕日本视频| 九九久久综合网站| 精品在线观看入口| 天天av天天操| 欧美天堂在线观看| 久久日韩视频| 欧美极品视频一区二区三区| 国模大尺度一区二区三区| 99热国产在线观看| www.亚洲免费视频| 亚洲丁香日韩| 国内自拍第二页| 色综合久久天天综合网| 91福利国产在线观看菠萝蜜| 精品免费视频123区| 国产在线国偷精品免费看| 亚洲高清毛片一区二区| 美女福利视频一区| 精品久久影视|