精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产av精国产传媒| 战狼4完整免费观看在线播放版| 国产精品一区hongkong| 91在线免费视频观看| 国产精品激情自拍| 手机在线免费看毛片| 欧美1区2区3区4区| 欧美精品一级二级三级| 亚洲熟妇无码一区二区三区导航| 国产三级在线免费| 成人一级黄色片| 国产精品久久久久久久久久| 久久久久成人精品无码| 国产一区二区三区四区五区传媒| 91精品国产综合久久精品app| 激情伊人五月天| 黄网页免费在线观看| 久久综合狠狠综合久久综合88| 91在线观看免费高清完整版在线观看| 国产又黄又粗又爽| 国内精品福利| 久久精品成人动漫| 中文字幕免费视频| 欧美亚洲大陆| 欧美r级在线观看| 亚洲综合欧美激情| 中文字幕人成乱码在线观看| 亚洲精品国产无套在线观| 先锋在线资源一区二区三区| 日韩在线视频第一页| 国产尤物一区二区在线| 国产精品第七影院| 天天干在线播放| 亚洲一级黄色| 色在人av网站天堂精品| 貂蝉被到爽流白浆在线观看| 奇米狠狠一区二区三区| 日韩成人在线视频| 制服丝袜第一页在线观看| 精品中文在线| 91精品国产欧美一区二区18| mm131国产精品| 99re66热这里只有精品4| 精品久久久久久久久久ntr影视| www.国产亚洲| av色综合久久天堂av色综合在| 国产精品久久久久永久免费观看 | 九九亚洲视频| 日韩电影大片中文字幕| 粉嫩av懂色av蜜臀av分享| 91久久精品无嫩草影院 | 日本91av在线播放| 国产 欧美 日韩 在线| 亚洲欧洲午夜| 6080yy精品一区二区三区| 久久精品久久国产| 日韩午夜免费视频| 97视频在线观看成人| 欧美精品亚洲精品日韩精品| 亚洲欧洲另类| 日本精品视频在线播放| 99精品人妻国产毛片| 久久亚洲二区| 国产精品一区二区电影| 国产又大又黑又粗| 国产麻豆精品一区二区| 波多野结衣久草一区| 朝桐光av在线一区二区三区| 成人小视频在线观看| 国产精品毛片一区视频| 天堂中文在线8| 久久久久久久网| 亚洲国产一区二区在线| 国产三级在线播放| 夜色激情一区二区| 九色在线视频观看| 欧美成人福利| 精品欧美乱码久久久久久| 97香蕉碰碰人妻国产欧美| 免费观看久久av| 色偷偷偷综合中文字幕;dd| 美女福利视频在线观看| 亚洲黄色大片| 国产精品综合久久久| 国产麻豆免费视频| a在线欧美一区| 亚洲国产欧美日韩| 麻豆tv在线| 亚洲一级二级在线| 中文字幕有码av| 无码国模国产在线观看| 亚洲欧洲黄色网| 亚洲天堂网av在线| 国产精品毛片一区二区三区| 国产日韩在线播放| 日批视频免费播放| 国产精品婷婷午夜在线观看| www.激情网| 成人国产精品一区二区免费麻豆| 欧美成人r级一区二区三区| 中文字幕在线免费看线人| 久久性感美女视频| 午夜精品久久久99热福利| 一二三四区视频| caoporm超碰国产精品| 国产精品99久久久久久大便| 中文一区一区三区高中清不卡免费| 欧美日韩高清一区二区三区| 双性尿奴穿贞c带憋尿| 一区二区日韩欧美| 国产精品黄色影片导航在线观看| 黄色av网址在线| 中文字幕在线不卡国产视频| 日韩欧美国产免费| av不卡一区二区| 久久精品国产欧美亚洲人人爽 | 欧美日韩免费在线视频| 黄色国产在线观看| 国产精品扒开腿做爽爽爽软件| 国产精品极品尤物在线观看| 欧美自拍偷拍一区二区| 亚洲美女在线一区| 天天插天天操天天射| 要久久爱电视剧全集完整观看| 欧美人成在线视频| 国产精品久久久久久免费免熟| 久久日韩精品一区二区五区| 国产精品www在线观看| 国产精品久久久久久久久久久久久久久 | 国内精品视频久久| 国产熟女一区二区三区五月婷| 国产嫩草影院久久久久| 狠狠爱免费视频| 日韩手机在线| 国内精品400部情侣激情| www.四虎在线观看| 亚洲视频 欧洲视频| 免费看涩涩视频| 欧美少妇性xxxx| 国产精欧美一区二区三区| 色视频在线观看免费| 午夜精品久久久久久久| 催眠调教后宫乱淫校园| 亚洲调教视频在线观看| 国产精品毛片va一区二区三区| av网站大全在线| 日韩精品影音先锋| 国产一级av毛片| 成人精品小蝌蚪| 男女猛烈激情xx00免费视频| 精品少妇一区| 97在线观看免费高清| 无码国精品一区二区免费蜜桃| 亚洲成人综合网站| 懂色av粉嫩av蜜乳av| 久久国产一二区| 日韩欧美一区二区三区久久婷婷| av在线日韩| 日韩中文字幕在线看| 91精品国产色综合久久不8| 国产精品国产三级国产aⅴ中文 | 久久久国产视频| 国产视频第一页| 亚洲精品成人a在线观看| 制服.丝袜.亚洲.中文.综合懂| 国内精品美女在线观看| 久久精品第九区免费观看| 日本高清不卡一区二区三区视频| 伊人久久免费视频| 97caocao| 亚洲va欧美va天堂v国产综合| 国产精品无码一区二区三| 丝袜a∨在线一区二区三区不卡| 视频在线99re| 高清不卡一区| 午夜精品福利在线观看| 国产精品麻豆一区二区三区| 欧美精品久久久久久久多人混战| 国产盗摄x88av| 91蜜桃视频在线| 国产三级国产精品国产专区50| 欧美在线资源| 欧美一区1区三区3区公司| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 欧美成人一区二区视频| 一区二区在线观看不卡| 国产男女猛烈无遮挡a片漫画 | 日批视频免费看| 久久精品午夜| 日本高清xxxx| 亚洲日本三级| 成人在线中文字幕| 超碰aⅴ人人做人人爽欧美| 久久亚洲私人国产精品va| 日韩av成人| 精品日产卡一卡二卡麻豆| 国产又粗又猛又爽又| 一区二区三区中文免费| 欧洲美一区二区三区亚洲| 粉嫩蜜臀av国产精品网站| 日本爱爱免费视频| 亚洲第一精品影视| 免费观看中文字幕| 国内精品久久久久久久影视简单| ts人妖另类在线| 成人h在线观看| 国内精品久久久久久影视8| 无遮挡动作视频在线观看免费入口 | 亚洲三级在线播放| 亚洲综合色一区| 粉嫩久久99精品久久久久久夜| 激情视频免费网站| 亚洲一区国产| www国产无套内射com| 日韩电影免费网址| 久久久久久久久一区二区| 午夜久久av| 成人国产精品久久久| 欧美性xxx| 26uuu日韩精品一区二区| 日本天码aⅴ片在线电影网站| 影音先锋日韩有码| 国产日韩精品在线看| 亚洲精品电影久久久| 午夜免费福利视频| 7777精品伊人久久久大香线蕉完整版 | 欧美1区免费| 可以免费看的黄色网址| 成人亚洲一区| 色噜噜色狠狠狠狠狠综合色一| 欧美亚洲国产日韩| 精品无码久久久久久久动漫| 午夜免费欧美电影| 97人人澡人人爽| 国产精品亚洲一区二区在线观看 | 秋霞网一区二区| 欧美不卡一区二区三区| 国产成人精品一区二区无码呦 | 国产精品吹潮在线观看| 欧美xx视频| 国产精品第一页在线| 亚洲承认视频| 国产精品电影久久久久电影网| 最新日韩三级| 国产狼人综合免费视频| 久久麻豆视频| 国产日韩中文字幕在线| 亚洲a成人v| 亚洲综合精品一区二区| 欧美视频精品全部免费观看| 91超碰在线电影| 成人午夜三级| 国产日韩欧美精品| 日韩欧美中文字幕电影| 欧美日韩电影一区二区三区| 少妇精品久久久一区二区| 亚洲成色www久久网站| 99久久精品费精品国产| 四虎免费在线观看视频| 国模吧视频一区| 日本一区二区黄色| 免费成人在线观看视频| 欧美性受xxxx黒人xyx性爽| 国产成人精品亚洲午夜麻豆| 欧美双性人妖o0| 91视频免费看| 欧美日韩中文字幕视频| 亚洲视频精选在线| 香蕉免费毛片视频| 色婷婷av一区二区三区软件| 一级二级三级视频| 欧美大片国产精品| 日本一本草久在线中文| 日韩中文字幕国产精品| 草美女在线观看| 国产成人综合精品在线| 九九99久久精品在免费线bt| 精品久久久久久亚洲| blacked蜜桃精品一区| 日韩 欧美 自拍| 一本一本久久| 老司机久久精品| 成人精品gif动图一区| 国产sm调教视频| 亚洲一区二区三区三| 国产精品第6页| 日韩女优av电影| 成年人视频在线免费观看| 欧美大荫蒂xxx| 国产精品高清乱码在线观看| 亚洲va久久久噜噜噜| 天堂综合网久久| 特级黄色录像片| 午夜在线a亚洲v天堂网2018| 91精品999| 97久久超碰国产精品| 免费看一级大片| 欧洲另类一二三四区| 后进极品白嫩翘臀在线视频| 在线亚洲男人天堂| 久热在线观看视频| 亚洲一区二区在线播放| jiujiure精品视频播放| 国产精品裸体瑜伽视频| 狠狠久久亚洲欧美| 国产又爽又黄无码无遮挡在线观看| 亚洲欧美另类在线| 国产99久久久久久免费看| 亚洲国产精品va在线| 黄色视屏免费在线观看| 国产精品av免费在线观看| 欧美人与动xxxxz0oz| 国内精品国产三级国产99| 免费成人在线影院| 久久只有这里有精品| 午夜精品久久久久影视| 精品人妻久久久久一区二区三区| 中文字幕欧美精品日韩中文字幕| 超碰在线视屏| 成人动漫视频在线观看完整版 | 无码人妻丰满熟妇区96| 国产盗摄精品一区二区三区在线 | 色婷婷av久久久久久久| 天堂网在线播放| 久久久久久中文| 中文一区二区三区四区| 99视频精品全部免费看| 九九久久精品视频| 国产福利在线导航| 欧美婷婷六月丁香综合色| 久草在现在线| 日韩av免费看网站| 久久91麻豆精品一区| 女人和拘做爰正片视频| 91色porny在线视频| 免费黄色网址在线| 亚洲欧美变态国产另类| 在线视频cao| 欧美婷婷久久| 日韩中文字幕不卡| 能直接看的av| 欧美另类久久久品| www在线免费观看视频| 91天堂在线观看| 欧美成人综合| 又黄又爽的网站| 狠狠久久五月精品中文字幕| 青青视频在线观| 国产成人综合精品| 久久大综合网| 亚洲男人天堂2021| 亚洲一区二区av电影| 天天干天天做天天操| 欧美一区二区三区……| 国产一区二区三区不卡视频网站| 乱子伦视频在线看| 日韩一区在线播放| 国产色在线视频| 午夜精品一区二区三区在线播放| 亚洲美女15p| 91n.com在线观看| 亚洲色图19p| 欧美一区二区三区黄片| 欧美自拍视频在线| 手机在线一区二区三区| 日韩av影视大全| 亚洲成a人片在线不卡一二三区| 污视频网站免费观看| 国产第一区电影| 天天射天天综合网| 国产亚洲精品成人a| 色综合天天性综合| 日韩在线免费电影| 成人影片在线播放| 欧美资源在线| 国产精品国产精品88| 亚洲第一天堂无码专区| 亚洲欧美在线成人| 蜜桃网站在线观看| 久久综合色综合88| 国产三级按摩推拿按摩| 4438全国成人免费| 国产韩日影视精品| 国产精品久久久久久久无码| 欧美日韩成人一区二区| 51精品在线| 亚洲一区综合| av福利精品导航| 97精品人妻一区二区三区| 午夜精品理论片| 久久精品国产亚洲夜色av网站| 少妇献身老头系列| 在线观看免费一区| 乱插在线www| 亚洲图片都市激情| 99国产精品一区| xxxx国产精品| 国产精品丝袜久久久久久高清| 99日韩精品| 久久久久久久久久久久久女过产乱|