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

聊聊Spring中的各項注解

開發 架構
作者個人研發的在高并發場景下,提供的簡單、穩定、可擴展的延遲消息隊列框架,具有精準的定時任務和延遲隊列處理功能。

[[385848]]

作者個人研發的在高并發場景下,提供的簡單、穩定、可擴展的延遲消息隊列框架,具有精準的定時任務和延遲隊列處理功能。自開源半年多以來,已成功為十幾家中小型企業提供了精準定時調度方案,經受住了生產環境的考驗。為使更多童鞋受益,現給出開源框架地址:https://github.com/sunshinelyz/mykit-delay

寫在前面

由于在更新其他專題的文章,Spring系列文章有很長一段時間沒有更新了,很多小伙伴都在公眾號后臺留言或者直接私信我微信催更Spring系列文章。

看來是要繼續更新Spring文章了。想來想去,寫一篇關于Spring中注解相關的文章吧,因為之前更新Spring系列的文章一直也是在更新Spring注解驅動開發。這篇文章也算是對之前文章的一個小小的總結吧,估計更新完這篇,我們會進入Spring的AOP章節的更新。

文章已收錄到:

https://github.com/sunshinelyz/technology-binghe

https://gitee.com/binghe001/technology-binghe

xml配置與類配置

1.xml配置

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <beans xmlns="http://www.springframework.org/schema/beans" 
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/sp 
  5.  <bean id="person" class="com.binghe.spring.Person"></bean> 
  6. </beans> 

獲取Person實例如下所示。

  1. public static void main( String[] args ){ 
  2.  ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); 
  3.  System.out.println(ctx.getBean("person")); 

2.類配置

  1. @Configuration 
  2. public class MainConfig { 
  3.     @Bean 
  4.     public Person person(){ 
  5.      return new Person(); 
  6.     } 
  7. }   

這里,有一個需要注意的地方:通過@Bean的形式是使用的話, bean的默認名稱是方法名,若@Bean(value="bean的名稱")那么bean的名稱是指定的 。

獲取Person實例如下所示。

  1. public static void main( String[] args ){ 
  2.  AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MainConfig.class); 
  3.  System.out.println(ctx.getBean("person")); 

@CompentScan注解

我們可以使用@CompentScan注解來進行包掃描,如下所示。

  1. @Configuration 
  2. @ComponentScan(basePackages = {"com.binghe.spring"}) 
  3.  public class MainConfig { 
  4. }  

excludeFilters 屬性

當我們使用@CompentScan注解進行掃描時,可以使用@CompentScan注解的excludeFilters 屬性來排除某些類,如下所示。

  1. @Configuration 
  2. @ComponentScan(basePackages = {"com.binghe.spring"},excludeFilters = { 
  3. @ComponentScan.Filter(type = FilterType.ANNOTATION,value = {Controller.class}), 
  4. @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,value = {PersonService.class}) 
  5. }) 
  6. public class MainConfig { 

includeFilters屬性

當我們使用@CompentScan注解進行掃描時,可以使用@CompentScan注解的includeFilters屬性將某些類包含進來。這里需要注意的是:需要把useDefaultFilters屬性設置為false(true表示掃描全部的)

  1. @Configuration 
  2. @ComponentScan(basePackages = {"com.binghe.spring"},includeFilters = { 
  3. @ComponentScan.Filter(type = FilterType.ANNOTATION,value = {Controller.class, PersonService.class}) 
  4. },useDefaultFilters = false
  5. public class MainConfig { 

@ComponentScan.Filter type的類型

注解形式的FilterType.ANNOTATION @Controller @Service @Repository @Compent

  • 指定類型的 FilterType.ASSIGNABLE_TYPE @ComponentScan.Filter(type =FilterType.ASSIGNABLE_TYPE,value = {Person.class})
  • aspectj類型的 FilterType.ASPECTJ(不常用)
  • 正則表達式的 FilterType.REGEX(不常用)
  • 自定義的 FilterType.CUSTOM
  1. public enum FilterType { 
  2.     //注解形式 比如@Controller @Service @Repository @Compent 
  3.     ANNOTATION, 
  4.     //指定的類型 
  5.     ASSIGNABLE_TYPE, 
  6.     //aspectJ形式的 
  7.     ASPECTJ, 
  8.     //正則表達式的 
  9.     REGEX, 
  10.     //自定義的 
  11.     CUSTOM 

FilterType.CUSTOM 自定義類型

  1. public class CustomFilterType implements TypeFilter { 
  2. @Override 
  3. public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { 
  4.     //獲取當前類的注解源信息 
  5.     AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata(); 
  6.     //獲取當前類的class的源信息 
  7.     ClassMetadata classMetadata = metadataReader.getClassMetadata(); 
  8.     //獲取當前類的資源信息 
  9.     Resource resource = metadataReader.getResource(); 
  10.   return classMetadata.getClassName().contains("Service"); 
  11.      
  12. @ComponentScan(basePackages = {"com.binghe.spring"},includeFilters = { 
  13. @ComponentScan.Filter(type = FilterType.CUSTOM,value = CustomFilterType.class) 
  14. },useDefaultFilters = false
  15. public class MainConfig { 

配置Bean的作用域對象

不指定@Scope

在不指定@Scope的情況下,所有的bean都是單實例的bean,而且是餓漢加載(容器啟動實例就創建好了)

  1. @Bean 
  2. public Person person() { 
  3.  return new Person(); 
  4. }  

@Scope為 prototype

指定@Scope為 prototype 表示為多實例的,而且還是懶漢模式加載(IOC容器啟動的時候,并不會創建對象,而是在第一次使用的時候才會創建)

  1. @Bean 
  2. @Scope(value = "prototype"
  3. public Person person() { 
  4.     return new Person(); 

@Scope取值

  • singleton 單實例的(默認)
  • prototype 多實例的
  • request 同一次請求
  • session 同一個會話級別

懶加載

Bean的懶加載@Lazy(主要針對單實例的bean 容器啟動的時候,不創建對象,在第一次使用的時候才會創建該對象)

  1. @Bean 
  2. @Lazy 
  3. public Person person() { 
  4.  return new Person(); 

@Conditional條件判斷

場景,有二個組件CustomAspect 和CustomLog ,我的CustomLog組件是依賴于CustomAspect的組件 應用:自己創建一個CustomCondition的類 實現Condition接口

  1. public class CustomCondition implements Condition { 
  2. /**** 
  3. @param context 
  4. * @param metadata 
  5. * @return 
  6. */ 
  7.     @Override 
  8.     public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { 
  9.         //判斷容器中是否有CustomAspect的組件 
  10.         return context.getBeanFactory().containsBean("customAspect"); 
  11.     }  
  12. }  
  13.  
  14. public class MainConfig { 
  15.     @Bean 
  16.     public CustomAspect customAspect() { 
  17.         return new CustomAspect(); 
  18.     }  
  19.     @Bean 
  20.     @Conditional(value = CustomCondition.class) 
  21.     public CustomLog customLog() { 
  22.      return new CustomLog(); 
  23.     } 

向IOC 容器添加組件

(1)通過@CompentScan +@Controller @Service @Respository @compent。適用場景: 針對我們自己寫的組件可以通過該方式來進行加載到容器中。

(2)通過@Bean的方式來導入組件(適用于導入第三方組件的類)

(3)通過@Import來導入組件 (導入組件的id為全類名路徑)

  1. @Configuration 
  2. @Import(value = {Person.class}) 
  3. public class MainConfig { 

通過@Import 的ImportSeletor類實現組件的導入 (導入組件的id為全類名路徑)

  1. public class CustomImportSelector implements ImportSelector {  
  2.     @Override 
  3.     public String[] selectImports(AnnotationMetadata importingClassMetadata) { 
  4.      return new String[]{"com.binghe.spring"}; 
  5.     } 
  6. }  
  7. Configuration 
  8. @Import(value = {Person.class} 
  9. public class MainConfig { 

通過@Import的 ImportBeanDefinitionRegister導入組件 (可以指定bean的名稱)

  1. public class DogBeanDefinitionRegister implements ImportBeanDefinitionRegistrar { 
  2.     @Override 
  3.     public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { 
  4.         //創建一個bean定義對象 
  5.         RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Dog.class); 
  6.         //把bean定義對象導入到容器中 
  7.         registry.registerBeanDefinition("dog",rootBeanDefinition); 
  8.     } 
  9. }  
  10. @Configuration 
  11. @Import(value = {Person.class, Car.class, CustomImportSelector.class, DogBeanDefinitionRegister.class}) 
  12. public class MainConfig { 

通過實現FacotryBean接口來實現注冊 組件

  1. public class CarFactoryBean implements FactoryBean<Car> { 
  2.     @Override 
  3.     public Car getObject() throws Exception { 
  4.      return new Car(); 
  5.     }  
  6.     @Override 
  7.     public Class<?> getObjectType() { 
  8.      return Car.class; 
  9.     }  
  10.  
  11.     @Override 
  12.     public boolean isSingleton() { 
  13.      return true
  14.     } 

Bean的初始化與銷毀

指定bean的初始化方法和bean的銷毀方法

由容器管理Bean的生命周期,我們可以通過自己指定bean的初始化方法和bean的銷毀方法

  1. @Configuration 
  2. public class MainConfig { 
  3.     //指定了bean的生命周期的初始化方法和銷毀方法.@Bean(initMethod = "init",destroyMethod = "destroy"
  4.     public Car car() { 
  5.      return new Car(); 
  6.     } 

針對單實例bean的話,容器啟動的時候,bean的對象就創建了,而且容器銷毀的時候,也會調用Bean的銷毀方法

針對多實例bean的話,容器啟動的時候,bean是不會被創建的而是在獲取bean的時候被創建,而且bean的銷毀不受IOC容器的管理

通過 InitializingBean和DisposableBean實現

通過 InitializingBean和DisposableBean個接口實現bean的初始化以及銷毀方法

  1. @Component 
  2. public class Person implements InitializingBean,DisposableBean { 
  3.     public Person() { 
  4.      System.out.println("Person的構造方法"); 
  5.     }  
  6.     @Override 
  7.     public void destroy() throws Exception { 
  8.      System.out.println("DisposableBean的destroy()方法 "); 
  9.     }  
  10.     @Override 
  11.     public void afterPropertiesSet() throws Exception { 
  12.      System.out.println("InitializingBean的 afterPropertiesSet方法"); 
  13.     } 

通過JSR250規范

通過JSR250規范 提供的注解@PostConstruct 和@ProDestory標注的方法

  1. @Component 
  2. public class Book { 
  3.     public Book() { 
  4.      System.out.println("book 的構造方法"); 
  5.     }  
  6.     @PostConstruct 
  7.     public void init() { 
  8.      System.out.println("book 的PostConstruct標志的方法"); 
  9.     }  
  10.     @PreDestroy 
  11.     public void destory() { 
  12.      System.out.println("book 的PreDestory標注的方法"); 
  13.     } 

通過BeanPostProcessor實現

通過Spring的BeanPostProcessor的 bean的后置處理器會攔截所有bean創建過程

  • postProcessBeforeInitialization 在init方法之前調用
  • postProcessAfterInitialization 在init方法之后調用
  1. @Component 
  2. public class CustomBeanPostProcessor implements BeanPostProcessor { 
  3.     @Override 
  4.     public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { 
  5.      System.out.println("CustomBeanPostProcessor...postProcessBeforeInitialization:"+beanName); 
  6.      return bean; 
  7.     }  
  8.     @Override 
  9.     public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { 
  10.         System.out.println("CustomBeanPostProcessor...postProcessAfterInitialization:"+beanName); 
  11.         return bean; 
  12.     } 
  13. }  

BeanPostProcessor的執行時機

  1. populateBean(beanName, mbd, instanceWrapper) 
  2. initializeBean{ 
  3.     applyBeanPostProcessorsBeforeInitialization() 
  4.     invokeInitMethods{ 
  5.     isInitializingBean.afterPropertiesSet() 
  6.     自定義的init方法 
  7. applyBeanPostProcessorsAfterInitialization()方法 

通過@Value +@PropertySource來給組件賦值

  1. public class Person { 
  2.     //通過普通的方式 
  3.     @Value("獨孤"
  4.     private String firstName; 
  5.     //spel方式來賦值 
  6.     @Value("#{28-8}"
  7.     private Integer age; 
  8.     通過讀取外部配置文件的值 
  9.     @Value("${person.lastName}"
  10.     private String lastName; 
  11. }  
  12. @Configuration 
  13. @PropertySource(value = {"classpath:person.properties"}) //指定外部文件的位置 
  14. public class MainConfig { 
  15.     @Bean 
  16.     public Person person() { 
  17.         return new Person(); 
  18.     } 

自動裝配

@AutoWired的使用

自動注入

  1. @Repository 
  2. public class CustomDao { 
  3. }  
  4. @Service 
  5. public class CustomService { 
  6.     @Autowired 
  7.     private CustomDao customDao; 
  8. } 

結論: (1)自動裝配首先時按照類型進行裝配,若在IOC容器中發現了多個相同類型的組件,那么就按照 屬性名稱來進行裝配

  1. @Autowired 
  2. private CustomDao customDao; 

比如,我容器中有二個CustomDao類型的組件 一個叫CustomDao 一個叫CustomDao2那么我們通過@AutoWired 來修飾的屬性名稱時CustomDao,那么拿就加載容器的CustomDao組件,若屬性名稱為tulignDao2 那么他就加載的時CustomDao2組件

(2)假設我們需要指定特定的組件來進行裝配,我們可以通過使用@Qualifier("CustomDao")來指定裝配的組件 或者在配置類上的@Bean加上@Primary注解

  1. @Autowired 
  2. @Qualifier("CustomDao"
  3. private CustomDao customDao2 

(3)假設我們容器中即沒有CustomDao 和CustomDao2,那么在裝配的時候就會拋出異常

  1. No qualifying bean of type 'com.binghhe.spring.dao.CustomDao' available 

若我們想不拋異常 ,我們需要指定 required為false的時候可以了

  1. @Autowired(required = false
  2. @Qualifier("customDao"
  3. private CustomDao CustomDao2; 

(4)@Resource(JSR250規范) 功能和@AutoWired的功能差不多一樣,但是不支持@Primary 和@Qualifier的支持

(5)@InJect(JSR330規范) 需要導入jar包依賴,功能和支持@Primary功能 ,但是沒有Require=false的功能

  1. <dependency> 
  2.     <groupId>javax.inject</groupId> 
  3.     <artifactId>javax.inject</artifactId> 
  4.     <version>1</version> 
  5. </dependency> 

(6)使用@Autowired 可以標注在方法上

  • 標注在set方法上
  1. //@Autowired 
  2. public void setCustomLog(CustomLog customLog) { 
  3.  this.customLog = customLog; 
  • 標注在構造方法上
  1. @Autowired 
  2. public CustomAspect(CustomLog customLog) { 
  3.  this.customLog = customLog; 

標注在配置類上的入參中(可以不寫)

  1. @Bean 
  2. public CustomAspect CustomAspect(@Autowired CustomLog customLog) { 
  3.     CustomAspect customAspect = new CustomAspect(customLog); 
  4.     return ustomAspect; 

XXXAwarce接口

我們自己的組件 需要使用spring ioc的底層組件的時候,比如 ApplicationContext等我們可以通過實現XXXAware接口來實現

  1. @Component 
  2. public class CustomCompent implements ApplicationContextAware,BeanNameAware { 
  3.     private ApplicationContext applicationContext; 
  4.     @Override 
  5.     public void setBeanName(String name) { 
  6.      System.out.println("current bean name is :【"+name+"】"); 
  7.     }  
  8.     @Override 
  9.     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 
  10.      this.applicationContext = applicationContext; 
  11.     } 

@Profile注解

通過@Profile注解 來根據環境來激活標識不同的Bean

@Profile標識在類上,那么只有當前環境匹配,整個配置類才會生效

@Profile標識在Bean上 ,那么只有當前環境的Bean才會被激活

沒有標志為@Profile的bean 不管在什么環境都可以被激活

  1. @Configuration 
  2. @PropertySource(value = {"classpath:ds.properties"}) 
  3. public class MainConfig implements EmbeddedValueResolverAware { 
  4.     @Value("${ds.username}"
  5.     private String userName; 
  6.     @Value("${ds.password}"
  7.     private String password
  8.     private String jdbcUrl; 
  9.     private String classDriver; 
  10.     @Override 
  11.     public void setEmbeddedValueResolver(StringValueResolver resolver) { 
  12.         this.jdbcUrl = resolver.resolveStringValue("${ds.jdbcUrl}"); 
  13.         this.classDriver = resolver.resolveStringValue("${ds.classDriver}"); 
  14.     }  
  15.     @Bean 
  16.     @Profile(value = "test"
  17.     public DataSource testDs() { 
  18.      return buliderDataSource(new DruidDataSource()); 
  19.     } 
  20.     @Bean 
  21.     @Profile(value = "dev"
  22.     public DataSource devDs() { 
  23.      return buliderDataSource(new DruidDataSource()); 
  24.     }  
  25.     @Bean 
  26.     @Profile(value = "prod"
  27.     public DataSource prodDs() { 
  28.      return buliderDataSource(new DruidDataSource()); 
  29.     }  
  30.     private DataSource buliderDataSource(DruidDataSource dataSource) { 
  31.         dataSource.setUsername(userName); 
  32.         dataSource.setPassword(password); 
  33.         dataSource.setDriverClassName(classDriver); 
  34.         dataSource.setUrl(jdbcUrl); 
  35.      return dataSource; 
  36.     } 

激活切換環境的方法

(1)運行時jvm參數來切換

  1. -Dspring.profiles.active=test|dev|prod   

(2)通過代碼的方式來激活

  1. public static void main(String[] args) { 
  2.     AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); 
  3.     ctx.getEnvironment().setActiveProfiles("test","dev"); 
  4.     ctx.register(MainConfig.class); 
  5.     ctx.refresh(); 
  6.     printBeanName(ctx); 

本文轉載自微信公眾號「冰河技術」,可以通過以下二維碼關注。轉載本文請聯系冰河技術公眾號。

 

責任編輯:武曉燕 來源: 冰河技術
相關推薦

2022-03-03 07:34:31

注解容器作用域

2017-12-22 09:59:43

2025-06-09 01:01:00

2024-03-04 07:41:18

SpringAOPOOP?

2022-06-28 14:57:09

FormatterSpring

2022-05-05 10:40:36

Spring權限對象

2025-05-09 09:05:00

Spring框架設計模式

2022-01-26 00:05:00

接口Spring管理器

2021-11-17 08:11:35

MySQL

2021-08-31 07:54:24

SQLDblink查詢

2023-11-09 11:56:28

MySQL死鎖

2024-04-26 00:00:00

Rust檢查器代碼

2024-11-14 14:53:04

2024-10-23 08:13:30

Spring響應式編程

2023-04-28 08:43:46

2021-06-04 08:48:46

Spring ClouMaven Centr版本

2020-07-02 07:44:27

Spring教程異步

2023-07-28 09:54:14

SQL數據Excel

2022-05-11 09:01:54

Swift類型系統幻象類型

2022-07-04 08:54:39

Swift處理器項目
點贊
收藏

51CTO技術棧公眾號

国产精品无码网站| 无码粉嫩虎白一线天在线观看| 69亚洲精品久久久蜜桃小说| 日韩大片在线| 日韩精品综合一本久道在线视频| 日韩一级性生活片| av资源种子在线观看| 国产伦精品一区二区三区视频青涩| 97视频色精品| 神马久久精品综合| 最新精品国偷自产在线| 91精品国产色综合久久不卡蜜臀 | 日韩在线观看| 日韩免费视频一区二区| 老司机午夜av| 国产极品在线观看| 日韩久久一区二区| 欧美日本亚洲| 黄色片一区二区| 麻豆国产欧美日韩综合精品二区| 午夜精品一区二区三区在线视频| 亚洲精品自拍视频在线观看| 欧美日韩一区二区三区四区不卡| 欧美日韩国产系列| 成人在线观看a| 色呦呦在线播放| 国产精品久久久久久久午夜片| 精品日产一区2区三区黄免费| 国产乱码久久久久| 日韩av成人高清| 97超碰蝌蚪网人人做人人爽| 欧洲猛交xxxx乱大交3| 日本一区二区免费高清| 亚洲欧美日韩在线高清直播| 人妻激情偷乱频一区二区三区| 日本成人一区二区| 欧美影院午夜播放| 国产成人综合一区| 性欧美18~19sex高清播放| 亚洲国产精品综合小说图片区| 永久域名在线精品| 欧美性videos| 国产精品久久网站| 亚洲国产激情一区二区三区| 美丽的姑娘在线观看免费动漫| 97久久超碰精品国产| 国内精品一区二区| 欧美一区二区黄片| 成人激情黄色小说| 国产亚洲精品自在久久| 国模人体一区二区| 成人18视频在线播放| 国产伦精品一区二区三区免 | 国产91丝袜在线播放| 91在线观看免费网站| 国产欧美熟妇另类久久久 | 91免费看网站| 成人毛片在线免费观看| 国产成人自拍高清视频在线免费播放| 91久久久久久| xxxx国产精品| 不卡av在线免费观看| 精品午夜一区二区三区| 五月天福利视频| 91麻豆swag| 日本欧美色综合网站免费| 精品无吗乱吗av国产爱色| 国产婷婷一区二区| 在线一区高清| 少妇视频在线| 精品久久久久久国产91| 欧美日韩激情视频在线观看| 成人av三级| 欧美日韩视频在线一区二区| 自拍偷拍21p| 亚洲一区电影| 亚洲精选在线观看| 天堂av网手机版| 国产精品豆花视频| 日韩av男人的天堂| 91精东传媒理伦片在线观看| 精品日韩欧美一区二区| 欧美高清性xxxxhd| 浮生影视网在线观看免费| 国产精品美女久久久久aⅴ| 一区二区视频在线观看| 色呦呦在线看| 一本一道波多野结衣一区二区| 超碰在线97免费| 亚洲日本一区二区三区在线| 日韩久久免费电影| 日韩三级久久久| 亚洲毛片视频| 91精品免费看| 三级在线电影| 亚洲免费视频中文字幕| 18岁网站在线观看| 久久久久亚洲精品中文字幕| 日韩美女av在线| tube国产麻豆| 日日夜夜精品视频天天综合网| 91系列在线观看| 精品视频一二三| 亚洲自拍另类综合| 午夜精品中文字幕| 最新国产一区| 国内精品美女av在线播放| 最新黄色网址在线观看| av不卡免费在线观看| 国产又大又长又粗又黄| 性欧美超级视频| 亚洲成人av片| 免费三级在线观看| 蜜桃视频在线观看一区二区| 国产一区二区三区高清视频| 国产写真视频在线观看| 欧美系列在线观看| 丰满少妇一区二区三区| 韩国欧美一区| 亚洲tv在线观看| 欧美777四色影视在线| 亚洲一区二区三区四区在线| 最新天堂中文在线| 国产一区日韩| 2019中文字幕在线观看| 人妻无码中文字幕| 一区二区三区欧美亚洲| 女同激情久久av久久| 欧美日中文字幕| 日本中文字幕不卡免费| 亚洲三区在线播放| 亚洲成av人片在线观看无码| 中文字幕在线观看视频www| 日韩电影一区| 国产精品无av码在线观看| 你懂的免费在线观看视频网站| 精品国产91久久久久久老师| 又黄又爽的网站| 欧美特黄a级高清免费大片a级| 国产日韩欧美影视| 永久免费在线观看视频| 精品1区2区3区| 国产馆在线观看| 蜜桃视频在线观看一区| 亚洲欧美日本国产有色| 99久久婷婷国产综合精品首页| 亚洲少妇激情视频| 国产91精品看黄网站在线观看| 久久精品在线免费观看| 日韩欧美xxxx| 欧美一区三区| 国产精品久久久久秋霞鲁丝| 在线观看美女网站大全免费| 欧美日韩国产一二三| 久久国产波多野结衣| 狠狠色丁香婷婷综合| 日韩亚洲欧美一区二区| 第四色中文综合网| 日本道色综合久久影院| 成人免费高清在线播放| 欧美日韩大陆在线| 国产精品白嫩白嫩大学美女| 粉嫩av一区二区三区在线播放| 国产自产在线视频| 天堂av一区二区三区在线播放| 国产91色在线|免| 在线日本视频| 日韩欧美一级在线播放| 日韩成人免费在线视频| 久久亚洲捆绑美女| 亚洲欧美国产中文| 欧美在线91| 美脚丝袜一区二区三区在线观看| 成人精品电影在线| 久久精品视频网站| 日本xxxxwww| 欧美影院一区二区| 免费在线观看黄视频| 久久一日本道色综合| www.精品在线| 国内一区二区三区| 日本视频一区在线观看| 久久久精品区| 国产成人精品av在线| 国产精品刘玥久久一区| 亚洲国产精品电影在线观看| 国产精品免费无遮挡无码永久视频| 国产精品成人午夜| 玖玖爱在线精品视频| 免费视频最近日韩| 人人干视频在线| 首页国产精品| 精品一区久久久久久| 一区在线不卡| 欧美一区二区影院| 羞羞网站在线看| 中文字幕亚洲一区在线观看 | 美女看a上一区| 欧洲精品在线播放| 成人在线免费观看网站| 国产精品乱码| 国产精品一区二区美女视频免费看 | 99久久国产免费免费| 欧美日韩电影免费看| 欧美xxxx做受欧美.88| 北条麻妃在线| 亚洲精品99999| 99国产精品一区二区三区| 91黄色小视频| 国产成人无码精品久在线观看| 国产精品久久久久久久久动漫 | 精品人妻一区二区三区蜜桃| 在线精品视频一区二区| 日韩精品人妻中文字幕| 一二三区精品视频| 999精品在线视频| 国产偷国产偷亚洲高清人白洁| 中国免费黄色片| 国产在线视频精品一区| 2025韩国理伦片在线观看| 亚洲影院在线| 黄色一级片在线看| 精品电影一区| 亚洲色欲久久久综合网东京热| 91精品天堂福利在线观看| 亚洲高清精品中出| 成人6969www免费视频| 欧美日产一区二区三区在线观看| 国产精品午夜av| 懂色一区二区三区av片| 国产精品一级在线观看| 91九色综合久久| 欧美性生活一级| 国产免费久久av| 91p九色成人| 国产精品美乳在线观看| www.成人在线视频| 国产精品电影一区| 国产精品字幕| 国产精品欧美风情| 国产精品原创视频| 国产精品视频一区国模私拍| 欧美影视资讯| 国产精品入口免费视频一| 中文另类视频| 国产色综合天天综合网| 宅男噜噜噜66国产精品免费| 91丝袜美腿美女视频网站| 麻豆国产一区| 丁香五月网久久综合| 精品精品精品| 欧美日韩国产三区| 国产精品一国产精品| 亚洲二区三区四区| 亚洲精品一区二区在线看| av中文字幕av| 韩国久久久久| 青青草原av在线播放| 老司机精品视频网站| 天堂网在线免费观看| 激情综合五月天| 亚洲女则毛耸耸bbw| 99久久国产免费看| 一区二区三区在线观看免费视频| 中文字幕欧美日本乱码一线二线| 亚洲欧美日韩第一页| 伊人色综合久久天天人手人婷| 日韩精品一区二区在线播放| 色成年激情久久综合| 一女二男一黄一片| 日韩一区二区免费高清| 午夜福利视频一区二区| 一区二区三区美女xx视频| 顶级网黄在线播放| 国产91成人video| 欧洲亚洲精品久久久久| 国产一区二区三区四区五区在线| 国产精品羞羞答答在线观看| 懂色av一区二区三区四区五区| 亚洲高清在线| www.天天射.com| 成人性色生活片免费看爆迷你毛片| 女~淫辱の触手3d动漫| 中文字幕一区二区不卡| 国产网站在线看| 欧美日韩一级片网站| 亚洲奶汁xxxx哺乳期| 在线精品视频视频中文字幕| 日韩成人伦理| 国产一区欧美二区三区| 欧美在线导航| 国产制服91一区二区三区制服| 亚洲日本国产| 中文字幕线观看| 久久婷婷久久一区二区三区| 强制高潮抽搐sm调教高h| 五月婷婷激情综合网| 国产一区二区在线视频观看| 日韩大陆毛片av| 国产最新在线| 国产精品扒开腿做爽爽爽男男| 91精品短视频| 亚洲一区在线直播| 毛片一区二区| av免费观看不卡| 亚洲乱码中文字幕| 中文字幕乱码人妻二区三区| 日韩精品视频免费| 青青草原av在线| 成人精品视频99在线观看免费| 欧美激情极品| 国产96在线 | 亚洲| 国产真实乱子伦精品视频| 国产精品成人一区二区三区电影毛片| 一区二区免费在线播放| 91欧美日韩麻豆精品| 一区二区日韩精品| 在线免费av资源| 99热国产免费| 中文字幕免费一区二区三区| 污污的网站免费| 国产午夜精品一区二区三区四区| 黄色片视频网站| 精品少妇一区二区三区| 大地资源网3页在线观看| 国产精品在线看| 国内亚洲精品| 亚洲精品高清无码视频| 久久久久国色av免费看影院| 久久久久99精品成人片三人毛片| 精品动漫一区二区三区在线观看 | 97在线视频免费观看| 一区中文字幕| 精品国产一区二区三区无码| 国产成人免费在线| 免费在线观看国产精品| 欧美v日韩v国产v| 丁香高清在线观看完整电影视频| 91丨九色丨国产| 欧美成人一品| 制服.丝袜.亚洲.中文.综合懂| 亚洲女与黑人做爰| 99热这里只有精品66| 欧美成人亚洲成人日韩成人| 欧美视频二区欧美影视| 日韩成人手机在线| 成人永久免费视频| 国产精品第72页| 亚洲毛片在线观看.| 欧美91看片特黄aaaa| 欧洲精品亚洲精品| 美女网站色91| www.av成人| 日韩欧美成人激情| 成人国产电影在线观看| 精品国产一区二区三区麻豆免费观看完整版 | 91亚洲精品一区二区乱码| 久久国产视频播放| 国产午夜精品一区二区三区| 国产成人77亚洲精品www| 中文字幕一区二区三区在线乱码| 国产综合色视频| 久久久久黄色片| 日韩精品中文字幕久久臀| 精品3atv在线视频| 潘金莲一级淫片aaaaa免费看| 国产不卡在线视频| 影音先锋在线国产| www.日韩视频| 高清日韩中文字幕| 国产福利影院在线观看| 亚洲人成影院在线观看| 六月丁香色婷婷| 国产精品久久久久久av下载红粉| 伊人久久大香线| 中出视频在线观看| 欧美日韩精品高清| 成人免费网站观看| 亚洲精品一品区二品区三品区| 国产高清在线精品| 懂色av蜜臀av粉嫩av分享吧最新章节| 色哟哟网站入口亚洲精品| 91亚洲无吗| 最新中文字幕免费视频| 亚洲一区中文在线| 国产一级免费在线观看| 51国偷自产一区二区三区的来源| 免播放器亚洲| 国产va在线播放| 正在播放欧美一区| 欧美理论电影在线精品| 亚洲va在线va天堂va偷拍| 欧美日韩亚洲一区二| www在线视频| 日韩精品欧美一区二区三区| 懂色一区二区三区免费观看| 亚洲无码久久久久| 97在线免费视频| 欧美~级网站不卡| 特级西西人体高清大胆|