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

一起來看看@Value竟然能玩出這么多花樣

開發 前端
今天咱們重點聊聊@Value注解,因為它是一個非常有用,但極其容易被忽視的注解,絕大多數人可能只用過它的一部分功能,這是一件非常遺憾的事情。

[[427987]]

前言

對于從事java開發工作的小伙伴來說,spring框架肯定再熟悉不過了。spring給開發者提供了非常豐富的api,滿足我們日常的工作需求。

如果想要創建bean實例,可以使用@Controller、@Service、@Repository、@Component等注解。

如果想要依賴注入某個對象,可以使用@Autowired和@Resource注解。

如果想要開啟事務,可以使用@Transactional注解。

如果想要動態讀取配置文件中的某個系統屬性,可以使用@Value注解。

等等,還有很多。。。

前面幾種常用的注解,在我以往的文章《@Autowired的這些騷操作,你都知道嗎?》《聊聊spring事務失效的12種場景,太坑了》《驚呆了,spring中竟然有12種定義bean的方法》中已經介紹過了,在這里就不過多講解了。

今天咱們重點聊聊@Value注解,因為它是一個非常有用,但極其容易被忽視的注解,絕大多數人可能只用過它的一部分功能,這是一件非常遺憾的事情。

所以今天有必要和大家一起,重新認識一下@Value。

1. 由一個例子開始

假如在UserService類中,需要注入系統屬性到userName變量中。通常情況下,我們會寫出如下的代碼:

  1. @Service 
  2. public class UserService { 
  3.  
  4.     @Value("${susan.test.userName}"
  5.     private String userName; 
  6.  
  7.     public String test() { 
  8.         System.out.println(userName); 
  9.         return userName; 
  10.     } 

通過@Value注解指定系統屬性的名稱susan.test.userName,該名稱需要使用${}包起來。

這樣spring就會自動的幫我們把對應的系統屬性值,注入到userName變量中。

不過,上面功能的重點是要在applicationContext.properties文件(簡稱:配置文件)中配置同名的系統屬性:

  1. #張三 
  2. susan.test.userName=\u5f20\u4e09 

那么,名稱真的必須完全相同嗎?

2. 關于屬性名

這時候,有些朋友可能會說:在@ConfigurationProperties配置類中,定義的參數名可以跟配置文件中的系統屬性名不同。

比如,在配置類MyConfig類中定義的參數名是userName:

  1. @Configuration 
  2. @ConfigurationProperties(prefix = "susan.test"
  3. @Data 
  4. public class MyConfig { 
  5.     private String userName; 

而配置文件中配置的系統屬性名是:

  1. susan.test.user-name=\u5f20\u4e09 

類中用的userName,而配置文件中用的user-name,不一樣。但測試之后,發現該功能能夠正常運行。

配置文件中的系統屬性名用 駝峰標識 或 小寫字母加中劃線的組合,spring都能找到配置類中的屬性名userName進行賦值。

由此可見,配置文件中的系統屬性名,可以跟配置類中的屬性名不一樣。不過,有個前提,前綴susan.test必須相同。

那么,@Value注解中定義的系統屬性名也可以不一樣嗎?

答案:不能。如果不一樣,啟動項目時會直接報錯。

此外,如果只在@Value注解中指定了系統屬性名,但實際在配置文件中沒有配置它,也會報跟上面一樣的錯。

所以,@Value注解中指定的系統屬性名,必須跟配置文件中的相同。

3. 亂碼問題

不知道細心的小伙伴們有沒有發現,我配置的屬性值:張三,其實是轉義過的。

  1. susan.test.userName=\u5f20\u4e09 

為什么要做這個轉義?

假如在配置文件中配置中文的張三:

  1. susan.test.userName=張三 

最后獲取數據時,你會發現userName竟然出現了亂碼:

  • å¼ ä¸‰

what?

為什么會出現亂碼?

答:在springboot的CharacterReader類中,默認的編碼格式是ISO-8859-1,該類負責.properties文件中系統屬性的讀取。如果系統屬性包含中文字符,就會出現亂碼。

那么,如何解決亂碼問題呢?

目前主要有如下三種方案:

  1. 手動將ISO-8859-1格式的屬性值,轉換成UTF-8格式。
  2. 設置encoding參數,不過這個只對@PropertySource注解有用。
  3. 將中文字符用unicode編碼轉義。

顯然@Value不支持encoding參數,所以方案2不行。

假如使用方案1,具體實現代碼如下:

  1. @Service 
  2. public class UserService { 
  3.  
  4.     @Value(value = "${susan.test.userName}"
  5.     private String userName; 
  6.  
  7.     public String test() { 
  8.         String userName1 = new String(userName.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); 
  9.         System.out.println(); 
  10.         return userName1; 
  11.     } 

確實可以解決亂碼問題。

但如果項目中包含大量中文系統屬性值,每次都需要加這樣一段特殊轉換代碼。出現大量重復代碼,有沒有覺得有點惡心?

反轉我被惡心到了。

那么,如何解決代碼重復問題呢?

答:將屬性值的中文內容轉換成unicode。

類似于這樣的:

  1. susan.test.userName=\u5f20\u4e09 

這種方式同樣能解決亂碼問題,不會出現惡心的重復代碼。但需要做一點額外的轉換工作,不過這個轉換非常容易,因為有現成的在線轉換工具。

推薦使用這個工具轉換:http://www.jsons.cn/unicode/

在這里順便告訴你一個小秘密:如果你使用的是.yml或.yaml格式的配置文件,并不會出現中文亂碼問題。

這又是為什么?

因為.yml或.yaml格式的配置文件,最終會使用UnicodeReader類進行解析,它的init方法中,首先讀取BOM文件頭信息,如果頭信息中有UTF8、UTF16BE、UTF16LE,就采用對應的編碼,如果沒有,則采用默認UTF8編碼。

需要注意的是:亂碼問題一般出現在本地環境,因為本地直接讀取的.properties配置文件。在dev、test、生產等環境,如果從zookeeper、apollo、nacos等配置中心中獲取系統參數值,走的是另外的邏輯,并不會出現亂碼問題。

4.默認值

有時候,默認值是我們非常頭疼的問題。

為什么這樣說呢?

因為很多時候使用java的默認值,并不能滿足我們的日常工作需求。

比如有這樣一個需求:如果配置了系統屬性,userName就用配置的屬性值。如果沒有配置,則userName用默認值susan。

有些朋友可能認為可以這樣做:

  1. @Value(value = "${susan.test.userName}"
  2. private String userName = "susan"

在定義參數時直接給個默認值,但如果仔細想想這招是行不通的的。因為設置userName默認值的時機,比@Value注解依賴注入屬性值要早,也就是說userName初始化好了默認值,后面還是會被覆蓋。

那么,到底該如何設置默認值呢?

答:使用:。

例如:

  1. @Value(value = "${susan.test.userName:susan}"
  2. private String userName; 

在需要設置默認值的系統屬性名后,加:符號。緊接著,在:右邊設置默認值。

建議大家平時在使用@Value時,盡量都設置一個默認值。如果不需要默認值,寧可設置一個空。比如:

  1. @Value(value = "${susan.test.userName:}"
  2. private String userName; 

為什么這么說?

假如有這種場景:在business層中包含了UserService類,business層被api服務和job服務都引用了。但UserService類中@Value的userName只在api服務中有用,在job服務中根本用不到該屬性。

對于job服務來說,如果不在.properties文件中配置同名的系統屬性,則服務啟動時就會報錯。

這個坑,我之前踩過多次。所以,建議大家,使用@Value注解時,最好給參數設置一個默認值,以防止出現類似的問題。

5. static變量

前面我們已經見識過,如何使用@Value注解,給類的成員變量注入系統屬性值。

那么,問題來了,靜態變量可以自動注入系統屬性值不?

我們一起看看,假如將上面的userName定義成static的:

  1. @Value("${susan.test.userName}"
  2. private static String userName; 

程序可以正常啟動,但是獲取到userName的值卻是null。

由此可見,被static修飾的變量通過@Value會注入失敗。

作為好奇寶寶的你,此時肯定想問:如何才能給靜態變量注入系統屬性值呢?

答:這就需要使用如下的騷代碼了:

  1. @Service 
  2. public class UserService { 
  3.  
  4.     private static String userName; 
  5.  
  6.     @Value("${susan.test.userName}"
  7.     public void setUserName(String userName) { 
  8.         UserService.userName = userName; 
  9.     } 
  10.  
  11.     public String test() { 
  12.         return userName; 
  13.     } 

提供一個靜態參數的setter方法,在該方法上使用@Value注入屬性值,并且同時在該方法中給靜態變量賦值。

有些細心的朋友可能會發現,@Value注解在這里竟然使用在setUserName方法上了,也就是對應的setter方法,而不是在變量上。

有趣,有趣,這種用法有點高端喔。

不過,通常情況下,我們一般會在pojo實體類上,使用lombok的@Data、@Setter、@Getter等注解,在編譯時動態增加setter或getter方法,所以@Value用在方法上的場景其實不多。

6.變量類型

上面的內容,都是用的字符串類型的變量進行舉例的。其實,@Value注解還支持其他多種類型的系統屬性值的注入。

6.1 基本類型

眾所周知,在Java中的基本數據類型有4類8種,然我們一起回顧一下:

  • 整型:byte、short、int、long
  • 浮點型:float、double
  • 布爾型:boolean
  • 字符型:char

相對應地提供了8種包裝類:

  • 整型:Byte、Short、Integer、Long
  • 浮點型:Float、Double
  • 布爾型:Boolean
  • 字符型:Character

@Value注解對這8中基本類型和相應的包裝類,有非常良好的支持,例如:

  1. @Value("${susan.test.a:1}"
  2. private byte a; 
  3.  
  4. @Value("${susan.test.b:100}"
  5. private short b; 
  6.  
  7. @Value("${susan.test.c:3000}"
  8. private int c; 
  9.  
  10. @Value("${susan.test.d:4000000}"
  11. private long d; 
  12.  
  13. @Value("${susan.test.e:5.2}"
  14. private float e; 
  15.  
  16. @Value("${susan.test.f:6.1}"
  17. private double f; 
  18.  
  19. @Value("${susan.test.g:false}"
  20. private boolean g; 
  21.  
  22. @Value("${susan.test.h:h}"
  23. private char h; 
  24.  
  25. @Value("${susan.test.a:1}"
  26. private byte a1; 
  27.  
  28. @Value("${susan.test.b:100}"
  29. private Short b1; 
  30.  
  31. @Value("${susan.test.c:3000}"
  32. private Integer c1; 
  33.  
  34. @Value("${susan.test.d:4000000}"
  35. private Long d1; 
  36.  
  37. @Value("${susan.test.e:5.2}"
  38. private Float e1; 
  39.  
  40. @Value("${susan.test.f:6.1}"
  41. private Double f1; 
  42.  
  43. @Value("${susan.test.g:false}"
  44. private Boolean g1; 
  45.  
  46. @Value("${susan.test.h:h}"
  47. private Character h1; 

有了這些常用的數據類型,我們在定義變量類型時,可以非常愉快的玩耍了,不用做額外的轉換。

6.2 數組

但只用上面的基本類型是不夠的,特別是很多需要批量處理數據的場景中。這時候可以使用數組,它在日常開發中使用的頻率很高。

我們在定義數組時可以這樣寫:

  1. @Value("${susan.test.array:1,2,3,4,5}"
  2. private int[] array; 

spring默認使用逗號分隔參數值。

如果用空格分隔,例如:

  1. @Value("${susan.test.array:1 2 3 4 5}"
  2. private int[] array; 

spring會自動把空格去掉,導致數據中只有一個值:12345,注意千萬別搞錯了。

順便說一下,定義數組的時候,里面還是有挺多門道的。比如上面列子中,我的數據是:1,2,3,4,5。

如果我們把數組定義成:short、int、long、char、string類型,spring是可以正常注入屬性值的。

但如果把數組定義成:float、double類型,啟動項目時就會直接報錯。

小伙伴們,下巴驚掉了沒?

按理說,1,2,3,4,5用float、double是能夠表示的呀,為什么會報錯?

如果使用int的包裝類,比如:

  1. @Value("${susan.test.array:1,2,3,4,5}"
  2. private Integer[] array; 

啟動項目時同樣會報上面的異常。

此外,定義數組時一定要注意屬性值的類型,必須完全一致才可以,如果出現下面這種情況:

  1. @Value("${susan.test.array:1.0,abc,3,4,5}"
  2. private int[] array; 

屬性值中包含了1.0和abc,顯然都無法將該字符串轉換成int。

6.3 集合類

有了基本類型和數組,的確讓我們更加方便了。但對數據的處理,只用數組這一種數據結構是遠遠不夠的,下面給大家介紹一下其他的常用數據結構。

6.3.1 List

List是數組的變種,它的長度是可變的,而數組的長度是固定的。

我們看看List是如何注入屬性值的:

  1. @Value("${susan.test.list}"
  2. private List<String> list; 

最關鍵的是看配置文件:

  1. susan.test.list[0]=10 
  2. susan.test.list[1]=11 
  3. susan.test.list[2]=12 
  4. susan.test.list[3]=13 

當你滿懷希望的啟動項目,準備使用這個功能的時候,卻發現竟然報錯了。 

what?

看來@Value不支持這種直接的List注入。

那么,如何解決這個問題呢?

有人說用@ConfigurationProperties。

需要定義一個MyConfig類:

  1. @Configuration 
  2. @ConfigurationProperties(prefix = "susan.test"
  3. @Data 
  4. public class MyConfig { 
  5.     private List<String> list; 

然后在調用的地方這樣寫:

  1. @Service 
  2. public class UserService { 
  3.  
  4.     @Autowired 
  5.     private MyConfig myConfig; 
  6.  
  7.     public String test() { 
  8.         System.out.println(myConfig.getList()); 
  9.         return null
  10.     } 

這種方法確實能夠完成List注入。但是,只能說明@ConfigurationProperties注解的強大,跟@Value有半毛錢的關系?

答:沒有。

那么,問題來了,用@Value如何實現這個功能呢?

答:使用spring的EL表達式。

List的定義改成:

  1. @Value("#{'${susan.test.list}'.split(',')}"
  2. private List<String> list; 

使用#號加大括號的EL表達式。

然后配置文件改成:

  1. susan.test.list=10,11,12,13 

跟定義數組時的配置文件一樣。

6.3.2 Set

Set也是一種保存數據的集合,它比較特殊,里面保存的數據不會重復。

我們可以這樣定義Set:

  1. @Value("#{'${susan.test.set}'.split(',')}"
  2. private Set<String> set

配置文件是這樣的:

  1. susan.test.set=10,11,12,13 

Set跟List的用法極為相似。

但為了證明本節的獨特之處,我打算說點新鮮的內容。

如何給List或者Set設置默認值空呢?

有些朋友可能會說:這還不簡單,直接在@Value的$表達式后面加個:號不就行了。

具體代碼如下:

  1. @Value("#{'${susan.test.set:}'.split(',')}"
  2. private Set<String> set

結果卻跟想象中不太一樣:

Set集合怎么不是空的,而是包含了一個空字符串的集合?

好吧,那我在:號后加null,總可以了吧?

Set集合也不是空的,而是包含了一個"null"字符串的集合。

這也不行,那也不行,該如何是好?

答:使用EL表達式的empty方法。

具體代碼如下:

  1. @Value("#{'${susan.test.set:}'.empty ? null : '${susan.test.set:}'.split(',')}"
  2. private Set<String> set

運行之后,結果對了:

其實List也有類似的問題,也能使用該方法解決問題。

在這里溫馨的提醒一下,該判斷的表達式比較復雜,自己手寫非常容易寫錯,建議復制粘貼之后根據實際需求改改。

6.3.3 Map

還有一種比較常用的集合是map,它支持key/value鍵值對的形式保存數據,并且不會出現相同key的數據。

我們可以這樣定義Map:

  1. @Value("#{${susan.test.map}}"
  2. private Map<String, String> map; 

配置文件是這樣的:

  1. susan.test.map={"name":"蘇三""age":"18"

這種用法跟上面稍微有一點區別。

設置默認值的代碼如下:

  1. @Value("#{'${susan.test.map:}'.empty ? null : '${susan.test.map:}'}"
  2. private Map<String, String> map; 

7 EL高端玩法

前面我們已經見識過spring EL表達式的用法了,在設置空的默認值時特別有用。

其實,empty方法只是它很普通的用法,還有更高端的用法,不信我們一起看看。

7.1 注入bean

以前我們注入bean,一般都是用的@Autowired或者@Resource注解。例如:

  1. @Service 
  2. public class RoleService { 
  3.     public String getRoleName() { 
  4.         return "管理員"
  5.     } 
  6.  
  7. @Service 
  8. public class UserService { 
  9.  
  10.     @Autowired 
  11.     private RoleService roleService; 
  12.  
  13.     public String test() { 
  14.         System.out.println(roleService.getRoleName()); 
  15.         return null
  16.     } 

但我要告訴你的是@Value注解也可以注入bean,它是這么做的:

  1. @Value("#{roleService}"
  2. private RoleService roleService; 

通過這種方式,可以注入id為roleService的bean。

7.2 bean的變量和方法

通過EL表達式,@Value注解已經可以注入bean了。既然能夠拿到bean實例,接下來,可以再進一步。

在RoleService類中定義了:成員變量、常量、方法、靜態方法。

  1. @Service 
  2. public class RoleService { 
  3.     public static final int DEFAULT_AGE = 18; 
  4.     public int id = 1000; 
  5.  
  6.     public String getRoleName() { 
  7.         return "管理員"
  8.     } 
  9.  
  10.     public static int getParentId() { 
  11.         return 2000; 
  12.     } 

在調用的地方這樣寫:

  1. @Service 
  2. public class UserService { 
  3.  
  4.     @Value("#{roleService.DEFAULT_AGE}"
  5.     private int myAge; 
  6.  
  7.     @Value("#{roleService.id}"
  8.     private int id; 
  9.  
  10.     @Value("#{roleService.getRoleName()}"
  11.     private String myRoleName; 
  12.  
  13.     @Value("#{roleService.getParentId()}"
  14.     private String myParentId; 
  15.  
  16.     public String test() { 
  17.         System.out.println(myAge); 
  18.         System.out.println(id); 
  19.         System.out.println(myRoleName); 
  20.         System.out.println(myParentId); 
  21.         return null
  22.     } 

在UserService類中通過@Value可以注入:成員變量、常量、方法、靜態方法獲取到的值,到相應的成員變量中。

一下子有沒有豁然開朗的感覺,有了這些,我們可以通過@Value注解,實現更多的功能了,不僅僅限于注入系統屬性。

7.3 靜態類

前面的內容都是基于bean的,但有時我們需要調用靜態類,比如:Math、xxxUtil等靜態工具類的方法,該怎么辦呢?

答:用T加括號。

示例1:

  1. @Value("#{T(java.io.File).separator}"
  2. private String path; 

可以注入系統的路徑分隔符到path中。

示例2:

  1. @Value("#{T(java.lang.Math).random()}"
  2. private double randomValue; 

可以注入一個隨機數到randomValue中。

7.4 邏輯運算

通過上面介紹的內容,我們可以獲取到絕大多數類的變量和方法的值了。但有了這些值,還不夠,我們能不能在EL表達式中加點邏輯?

拼接字符串:

  1. @Value("#{roleService.roleName + '' + roleService.DEFAULT_AGE}"
  2. private String value; 

邏輯判斷:

  1. @Value("#{roleService.DEFAULT_AGE > 16 and roleService.roleName.equals('蘇三')}"
  2. private String operation; 

三目運算:

  1. @Value("#{roleService.DEFAULT_AGE > 16 ? roleService.roleName: '蘇三' }"
  2. private String realRoleName; 

還有很多很多功能,我就不一一列舉了。

EL表達式實在太強大了,對這方面如果感興趣的小伙伴可以找我私聊。

8 ${}和#{}的區別

上面巴拉巴拉說了這么多@Value的牛逼用法,歸根揭底就是${}和#{}的用法。

下面重點說說${}和#{}的區別,這可能是很多小伙伴比較關心的話題。

8.1 ${}

主要用于獲取配置文件中的系統屬性值。

例如:

  1. @Value(value = "${susan.test.userName:susan}"
  2. private String userName; 

通過:可以設置默認值。如果在配置文件中找不到susan.test.userName的配置,則注入時用默認值。

如果在配置文件中找不到susan.test.userName的配置,也沒有設置默認值,則啟動項目時會報錯。

8.2 #{}

主要用于通過spring的EL表達式,獲取bean的屬性,或者調用bean的某個方法。還有調用類的靜態常量和靜態方法。

  1. @Value("#{roleService.DEFAULT_AGE}"
  2. private int myAge; 
  3.  
  4. @Value("#{roleService.id}"
  5. private int id; 
  6.  
  7. @Value("#{roleService.getRoleName()}"
  8. private String myRoleName; 
  9.  
  10. @Value("#{T(java.lang.Math).random()}"
  11. private double randomValue; 

如果是調用類的靜態方法,則需要加T(包名 + 方法名稱)。

例如:T(java.lang.Math)。

好了,今天的內容就介紹到這里,希望對你會有所幫助。隨便劇透一下,后面的文章會繼續介紹:

  1. @Value的原理
  2. @Value動態刷新屬性值的原因
  3. @ConfigurationProperties注解的用法,它也非常強大。

 

責任編輯:姜華 來源: 蘇三說技術
相關推薦

2021-01-19 05:29:41

代碼Git 工作流

2021-03-26 10:48:14

代碼語言提交

2024-06-18 08:46:06

2021-09-09 08:47:52

Dependency 安全漏洞工具

2021-06-11 06:45:32

SQL結構化語言

2024-03-21 08:21:34

Java 22Java 語言開發工具包

2024-05-24 08:35:00

Angular 18版本更新

2023-10-20 10:11:00

Nuxt 3.8前端

2024-04-23 10:29:44

SassCSS前端

2022-03-18 08:16:51

微軟Windows 11

2022-01-25 12:14:39

面試try-catch代碼

2010-05-10 17:21:26

Unix操作系統

2022-06-24 06:32:46

iOS 16Beta 2

2024-03-08 06:58:55

TypeScript類型縮小模塊解析

2021-07-15 05:26:22

Windows 10操作系統微軟

2024-04-09 10:10:23

GridCSS網格

2021-05-14 05:20:45

Windows10操作系統微軟

2020-03-03 13:55:38

騰訊手機QQ

2019-11-26 14:11:52

互聯網裁員員工

2021-02-01 08:16:14

ChromeNode.js
點贊
收藏

51CTO技術棧公眾號

激情小视频网站| 久久99国产精品自在自在app| 欧洲精品一区二区三区久久| 神马久久久久| 蜜臀99久久精品久久久久久软件| 久久精品一本久久99精品| 精品无码av一区二区三区| 亚洲欧美小说色综合小说一区| 中文字幕成人av| 国产激情美女久久久久久吹潮| 国产乱国产乱老熟| 久久精品免费一区二区三区| 亚洲第一精品夜夜躁人人爽 | 欧美在线一区二区| 大荫蒂性生交片| 91美女视频在线| 成人免费观看av| 国产在线观看不卡| 亚洲不卡在线视频| 99av国产精品欲麻豆| 久久久999精品免费| 熟女高潮一区二区三区| 在线视频成人| 精品视频在线视频| 18禁免费无码无遮挡不卡网站| 精产国品自在线www| 久久精品一区蜜桃臀影院| 粉嫩精品一区二区三区在线观看| 中文字幕av网站| 性高湖久久久久久久久| 欧美激情喷水视频| 欧美成欧美va| 亚洲国产一区二区三区在线播放| 在线看片第一页欧美| 精品人妻一区二区三区日产乱码卜| 国产精品成人**免费视频| 欧美午夜寂寞影院| 亚欧在线免费观看| 成人天堂yy6080亚洲高清| 亚洲va欧美va国产va天堂影院| 99re99热| 国产原创精品视频| 亚洲天堂成人在线观看| 老司机av福利| 麻豆av在线免费看| 亚洲欧洲日韩在线| 超碰免费在线公开| 国产精品久久麻豆| 一区二区三区在线视频免费| 欧美日韩中文字幕在线播放 | 韩剧1988免费观看全集| 青青青在线视频| 欧美aⅴ99久久黑人专区| 免费91在线视频| www青青草原| 亚洲午夜视频| 6080yy精品一区二区三区| 香蕉免费毛片视频| 噜噜噜久久亚洲精品国产品小说| 欧美夜福利tv在线| 999视频在线| 久久精品99国产国产精| 成人黄色在线播放| 超碰在线观看av| 成人白浆超碰人人人人| 久久综合一区| 国产中文字幕在线观看| 欧美国产日产图区| 国产一区一区三区| 动漫一区二区| 日韩欧美亚洲综合| 天天干天天操天天玩| 国产95亚洲| 欧美精品一区在线观看| 国产男男chinese网站| 精品福利久久久| 久久九九有精品国产23| 久久久久无码精品国产| 午夜影院日韩| 国产视频999| 日本高清视频www| 久久精品无码一区二区三区| 亚洲一二三区在线| 黄网站在线观| 欧美性欧美巨大黑白大战| 中文字幕资源在线观看| 美女视频亚洲色图| 中文字幕一区二区精品| 国产亚洲精品成人| 日韩电影在线免费观看| 3d蒂法精品啪啪一区二区免费| 欧美自拍偷拍一区二区| 国产精品私房写真福利视频| 日本一级黄视频| 日本免费久久| 欧美电影免费观看完整版 | 国产精品护士白丝一区av| 9191国产视频| 久久久一本精品| 日韩欧美亚洲国产另类| 天天躁日日躁aaaa视频| 综合激情在线| 国产精品久久久久久久久久免费| 国产免费一区二区三区最新不卡| 91在线精品秘密一区二区| 黄瓜视频免费观看在线观看www| av丝袜在线| 欧美日韩亚洲视频| 日韩免费毛片视频| 精品中文在线| 伊人一区二区三区久久精品| 日韩精品一区二区不卡| 精品一区二区免费在线观看| 玛丽玛丽电影原版免费观看1977| 成人在线直播| 欧美性高清videossexo| 国产毛片毛片毛片毛片毛片毛片| 66久久国产| 国产专区欧美专区| 国产在线自天天| 欧美性xxxx在线播放| 久久久久亚洲av无码网站| 色乱码一区二区三区网站| 555www成人网| 天堂av在线免费| 亚洲国产精品人人做人人爽| 亚洲天堂av一区二区| 国产精品久久久久影院亚瑟| 国产精品久久久久久久久久久久久久 | 欧美人妖在线| 992tv成人免费影院| 超碰福利在线观看| 亚洲人成在线播放网站岛国| 人人干人人干人人| 欧美日韩中文一区二区| 日韩av免费看| 欧美3p视频在线观看| 福利二区91精品bt7086| 美女久久久久久久久| 欧美.日韩.国产.一区.二区| 91精品综合视频| 久操视频在线| 91精品国产丝袜白色高跟鞋| 999精品视频在线观看播放| 蜜臀久久99精品久久久久久9| 欧美高清一区二区| 日韩电影免费观| 亚洲人成绝费网站色www| 亚洲影院在线播放| 久久精品一区八戒影视| www.日本xxxx| 四季av一区二区三区免费观看| 国产精品成久久久久三级| av一本在线| 欧美日韩国产区一| 人妻人人澡人人添人人爽| 国产成人免费在线观看不卡| 日本国产中文字幕| 极品国产人妖chinesets亚洲人妖| 高清一区二区三区日本久| 亚洲 国产 欧美 日韩| 欧美视频在线看| 日本爱爱爱视频| 狠狠色狠狠色综合系列| 永久免费看av| 露出调教综合另类| 日韩av观看网址| a视频在线播放| 亚洲国产另类久久精品 | 天天干在线视频论坛| 亚洲成人激情在线观看| 在线观看 亚洲| 一区二区中文视频| 喷水视频在线观看| 日韩精品免费视频人成| 久久久久亚洲av无码专区喷水| 亚洲一区二区三区在线免费| 91精品国产高清久久久久久| 91福利在线视频| 日韩精品一区二区三区在线观看 | 亚洲福利在线视频| 波多野结衣绝顶大高潮| 亚洲色图欧美偷拍| 国产 xxxx| 美国欧美日韩国产在线播放| www.亚洲成人网| 久久av网址| 91丝袜脚交足在线播放| 国产精品一区二区av影院萌芽| 中文字幕无线精品亚洲乱码一区 | 国产麻豆一精品一男同| 亚洲18女电影在线观看| 日本不卡一区视频| 成人av在线资源| 一本岛在线视频| 亚洲精品乱码| 一区二区在线高清视频| 久久久精品国产**网站| 国产日韩欧美视频| 黄色aa久久| 久久深夜福利免费观看| 欧洲视频在线免费观看| 欧美一二三四在线| 又骚又黄的视频| 欧美日韩国产中文字幕 | 男女精品网站| 人人妻人人澡人人爽欧美一区| 欧美艳星介绍134位艳星| 国产女主播一区二区| 91亚洲精品在看在线观看高清| 欧美亚洲另类制服自拍| 蜜臀av在线| 久久午夜a级毛片| 国产高清一区在线观看| 亚洲第一精品夜夜躁人人躁 | 成人黄色免费网站| 91av免费观看91av精品在线| 在线视频中文字幕第一页| 中日韩美女免费视频网址在线观看| 农村少妇久久久久久久| 欧美精品aⅴ在线视频| 亚洲婷婷综合网| 亚洲成av人影院在线观看网| 国模无码国产精品视频| 国产精品国产自产拍高清av| 91l九色lporny| 久久久久免费观看| 熟女少妇一区二区三区| av午夜一区麻豆| 一边摸一边做爽的视频17国产 | 欧日韩不卡视频| 国产视频在线观看一区二区三区| 久久人妻少妇嫩草av无码专区| 国产a视频精品免费观看| 香蕉视频xxx| 国产一区在线观看视频| 一级黄色高清视频| 国产一区二区三区不卡在线观看| 午夜激情av在线| 蜜桃视频在线一区| 污版视频在线观看| 麻豆精品在线播放| 伊人网在线综合| 久国产精品韩国三级视频| 中文字幕在线综合| 麻豆精品蜜桃视频网站| 蜜臀一区二区三区精品免费视频| 蜜臀va亚洲va欧美va天堂| 国产三级国产精品国产专区50| 麻豆精品视频在线| 在线播放免费视频| 国产成人综合自拍| jjzzjjzz欧美69巨大| a级精品国产片在线观看| 欧美 变态 另类 人妖| 97精品久久久午夜一区二区三区| 午夜一区二区三区免费| 欧美国产精品一区二区| 中国一级片在线观看| 一区二区久久久久久| 国产午夜免费视频| 欧美日韩视频免费播放| 无码人妻一区二区三区线| 欧美日韩精品一区二区天天拍小说 | 欧美精品九九99久久| aa视频在线免费观看| 欧美精品一区二区蜜臀亚洲| 日本大臀精品| 色噜噜狠狠狠综合曰曰曰| 在线观看免费视频你懂的| 97视频在线播放| 亚洲a∨精品一区二区三区导航| 国产欧美婷婷中文| 国产精品chinese在线观看| 欧美裸体网站| 一区二区三区四区电影| 亚洲国产精品无码观看久久| 老司机免费视频久久| 成年网站在线播放| 国产成人啪免费观看软件| 91视频在线网站| 日韩理论在线观看| 精品成人av一区二区在线播放| 欧美三区在线观看| 亚洲国产综合一区| 亚洲天堂开心观看| 青青草原国产在线| 国产精品xxx视频| 精品一区二区三区中文字幕视频 | 一道本成人在线| 91亚洲国产成人精品一区| 亚洲国产成人av在线| 麻豆视频在线播放| 国产97免费视| 99re91这里只有精品| 一区二区三区四区视频在线观看| 亚洲黄色影院| 992kp免费看片| 久久久久亚洲蜜桃| 国产精品9191| 在线综合视频播放| 国产中文字幕在线| 91国语精品自产拍在线观看性色| 亚洲精品第一| 日韩中文字幕一区| 亚洲精品四区| 色欲欲www成人网站| 国产精品伦理一区二区| 国产精品一区二区6| 欧美一级高清片在线观看| 成a人片在线观看www视频| 91极品视频在线| 一区二区免费| 国产香蕉一区二区三区| 蜜臀av性久久久久蜜臀aⅴ | 中文字幕 日韩 欧美| 久久久无码精品亚洲日韩按摩| 久久黄色免费网站| 欧美一区二区视频在线观看| 国产露出视频在线观看| 欧美亚洲日本黄色| 国产一级成人av| 日韩欧美猛交xxxxx无码| 国产一区二区成人久久免费影院 | 日韩欧美国产激情| 欧日韩在线视频| 欧美激情中文网| 999精品视频在这里| 好吊色视频988gao在线观看| 卡一卡二国产精品| 在线观看亚洲大片短视频| 欧美性猛交xxxx乱大交蜜桃| 天堂v视频永久在线播放| 国语自产精品视频在线看抢先版图片| 麻豆国产一区二区三区四区| 中文字幕av导航| 国产精品综合一区二区| 婷婷久久综合网| 91精品国产免费久久综合| 黄视频网站在线| 亚洲综合最新在线| 你懂的亚洲视频| 韩国一区二区三区四区| 亚洲尤物在线视频观看| 人妻无码一区二区三区久久99 | 国产精品第九页| 亚洲高清久久久久久| 日产福利视频在线观看| 久久婷婷人人澡人人喊人人爽| 国产精品最新自拍| 欧美特黄一区二区三区| 欧美优质美女网站| 日本三级在线视频| 亚洲japanese制服美女| 欧美不卡在线| 免费成人深夜夜行p站| 在线看国产日韩| 蜜桃视频网站在线观看| 亚洲自拍欧美另类| 亚洲精华国产欧美| 人妻少妇一区二区| 欧美视频一区二区三区四区 | 欧美日韩免费看| 精品视频一二三| 国产精自产拍久久久久久| 综合激情婷婷| 国产伦精品一区二区三区妓女| 在线免费一区三区| 国产不卡在线| 精品视频导航| 老司机精品视频导航| 欧美精品xxxxx| 亚洲视频电影图片偷拍一区| 亚洲精品aa| 男人天堂1024| 国产精品久久久久久福利一牛影视| av免费在线观看不卡| 51ⅴ精品国产91久久久久久| 日韩在线视屏| 中文字幕第3页| 欧美色国产精品| 成人在线高清免费| 亚欧洲精品在线视频免费观看| 国产中文一区二区三区| 亚洲精品www久久久久久| 中国日韩欧美久久久久久久久| 99精品在免费线中文字幕网站一区| 99999精品视频| 亚洲日本在线a| 日韩精品系列| 91嫩草国产在线观看| 天堂va蜜桃一区二区三区 | 日本精品一区二区三区四区的功能| 三级外国片在线观看视频| 国产偷国产偷亚洲高清97cao| 免费观看30秒视频久久| 天堂中文在线网| 九九热最新视频//这里只有精品| 九九精品久久| 成年人小视频在线观看|