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

欧美激情视频网址| 日韩女优视频免费观看| 亚洲在线不卡| 97在线公开视频| 最新亚洲一区| 亚洲色图第三页| 91大神免费观看| 性xxxxfreexxxxx欧美丶| 国产精品视频你懂的| 1区1区3区4区产品乱码芒果精品| 日韩在线视频免费播放| 欧美在线色图| 欧美精品一区二区三区蜜桃视频| 97公开免费视频| 9999在线视频| 国产精品私人影院| 精品乱码一区| 99精品在线视频观看| 久久成人在线| 色综合91久久精品中文字幕| 国产真实乱人偷精品人妻| 精品91福利视频| 在线观看三级视频欧美| 欧美高清中文字幕| 日本在线免费播放| 久久久精品综合| 高清国语自产拍免费一区二区三区| 波多野结衣视频观看| 一区三区视频| 粗暴蹂躏中文一区二区三区| 亚洲人成人无码网www国产| 国产精品三p一区二区| 91精品国产福利在线观看 | 国产天堂素人系列在线视频| 国产成人免费视频一区| 国产精品自拍网| 久久久久久久伊人| 伊人青青综合网| 一区二区成人av| 中国毛片在线观看| 美日韩黄色大片| 精品日韩一区二区| 国产男女无遮挡猛进猛出| 桃子视频成人app| 欧美午夜精品久久久久久久| 男的插女的下面视频| 91麻豆一二三四在线| 一区精品在线播放| 亚洲国产一区二区三区在线播| 青青青草网站免费视频在线观看| 风间由美一区二区三区在线观看| 成人在线播放av| 97av免费视频| 精品亚洲免费视频| 成人国产在线视频| 一级特黄色大片| 精品影视av免费| 91精品在线国产| 国产免费黄色网址| 国产乱淫av一区二区三区| 国产中文字幕亚洲| 91中文字幕在线视频| 国模大尺度一区二区三区| 国产日韩欧美在线视频观看| 中文字字幕在线观看| 青椒成人免费视频| 国产日韩欧美在线看| 国产女18毛片多18精品| 国产成人在线看| 国产伦精品一区二区三毛| 污视频在线免费| 久久婷婷国产综合国色天香| 欧美日韩在线精品| 麻豆传媒在线完整视频| 一区二区三区中文在线| 五十路熟女丰满大屁股| 亚洲欧洲日本韩国| 精品视频在线免费| 亚洲午夜精品在线观看| 久久精品国产亚洲5555| 亚洲人成免费电影| 国产美女网站视频| 欧美日韩精品一本二本三本| 亚洲97在线观看| 久久久久久久久久一级| 国产综合久久久久影院| 国产精品区一区| 男人av在线| 亚洲欧洲日产国码二区| 免费 成 人 黄 色| 99re久久| 精品剧情v国产在线观看在线| 91av在线免费| 久久美女视频| 国外视频精品毛片| 中文字幕人妻精品一区| 从欧美一区二区三区| 日本电影一区二区三区| 3d玉蒲团在线观看| 日韩欧美在线国产| 宇都宫紫苑在线播放| 四虎影视精品| 欧美成人sm免费视频| 天堂а√在线中文在线新版| 精品亚洲porn| 久久国产精品久久| 国产激情在线| 在线观看一区二区视频| 国产无套精品一区二区三区| 国内精品伊人久久久| 欧美日韩国产999| 怡春院在线视频| 99精品一区二区三区| 公共露出暴露狂另类av| 成人性生活视频| 欧美大胆人体bbbb| 粉嫩精品久久99综合一区| 亚洲裸体俱乐部裸体舞表演av| 国产欧美日韩中文字幕| 欧洲亚洲精品视频| 亚洲一本大道在线| 中文字幕1234区| 欧美一区二区麻豆红桃视频| 51视频国产精品一区二区| 国产sm主人调教女m视频| 国产精品区一区二区三| 国产l精品国产亚洲区久久| 一区二区亚洲视频| 久久精品人人做人人爽| av首页在线观看| 91视频www| 五十路熟女丰满大屁股| 91亚洲无吗| 成人97在线观看视频| 一级片在线观看视频| 中文字幕免费在线观看视频一区| 成人综合视频在线| 美女一区二区在线观看| 欧美精品999| 亚洲大尺度网站| 亚洲精品欧美在线| 无套内谢丰满少妇中文字幕| 色小子综合网| 91精品在线观| 成人免费网址| 日韩一区二区精品| 欧美xxxx黑人xyx性爽| 韩国一区二区视频| 国产成年人在线观看| 亚洲在线资源| 欧美成人中文字幕| 国产精品久久久久久69| 国产精品激情偷乱一区二区∴| 中文字幕天天干| 色999日韩| 91热精品视频| 羞羞的视频在线看| 亚洲精品在线观| 日韩成人免费在线观看| 91偷拍与自偷拍精品| 黄色片视频在线免费观看| 亚洲三级网页| 国产精品久久精品| 亚乱亚乱亚洲乱妇| 91精品国产一区二区三区 | 你懂的网址国产 欧美| 91久久国产精品| 手机av在线播放| 亚洲成人在线视频播放| 日本一区二区三区精品| 久久久av毛片精品| 三区视频在线观看| 亚洲午夜一级| 欧美久久综合性欧美| 成人在线免费电影网站| 久久久国产91| 欧洲av在线播放| 欧美小视频在线| 欧美福利在线视频| 国产风韵犹存在线视精品| 无码专区aaaaaa免费视频| 欧美美女在线观看| 91视频九色网站| h片在线观看下载| 亚洲日韩第一页| 国产色在线视频| 精品欧美国产一区二区三区| 黄色一级片一级片| 成人av免费在线观看| 精品久久久久久久无码| 亚洲综合中文| 欧美日韩三区四区| 国产精品一站二站| 欧美与欧洲交xxxx免费观看 | 欧美精品久久久久| 国产在线一二| 欧美xxxxxxxx| 天堂免费在线视频| 亚洲一区在线观看免费| 欧美亚洲色综久久精品国产| 成人一区二区三区| 国产高潮免费视频| 在线看片一区| 日本一区二区免费高清视频| 免费看成人哺乳视频网站| 亚洲iv一区二区三区| 韩国久久久久久| 欧美老肥婆性猛交视频| 韩国精品视频| 精品国产91洋老外米糕| 亚洲中文字幕在线一区| 欧美日韩国产丝袜另类| 91香蕉视频在线播放| 久久久精品免费网站| 美女久久久久久久久| 久久99久久久久| 女性隐私黄www网站视频| 国产综合色产| 妞干网这里只有精品| 精品一区二区三区中文字幕老牛| 国产女主播一区二区| 国产精品xnxxcom| 国产欧美日韩中文字幕| 日韩精品99| 欧美在线视频一二三| av电影免费在线看| 欧美二区乱c黑人| 成码无人av片在线观看网站| 在线精品国产欧美| 九九九伊在人线综合| 日韩久久免费电影| 天天干天天色天天| 亚洲精品一区二区三区在线观看| 99在线观看免费| 3d动漫精品啪啪1区2区免费| 中文字幕一区二区在线视频| 色婷婷精品大在线视频| 中文字幕超碰在线| 欧美日韩国产色视频| 国产做受高潮漫动| 午夜伊人狠狠久久| 日本少妇久久久| 亚洲午夜av在线| 久久视频免费在线观看| 亚洲午夜激情网页| 日韩人妻无码一区二区三区99| 一区二区三区在线高清| 日本在线一级片| 亚洲美女屁股眼交3| 三级黄色录像视频| 国产精品家庭影院| 性欧美疯狂猛交69hd| 亚洲激情成人在线| 久久久久黄色片| 午夜精品一区在线观看| 日本一级一片免费视频| 无码av免费一区二区三区试看| 日本三级午夜理伦三级三| 午夜精品福利一区二区蜜股av| 日韩欧美大片在线观看| 欧美性猛交xxxx富婆| 精品一区二三区| 欧美日本乱大交xxxxx| 国产熟女一区二区丰满| 精品日本一线二线三线不卡| 日韩有码第一页| 亚洲老司机av| 亚洲s色大片| 欧美激情亚洲另类| 亚洲男人av| 成人免费淫片aa视频免费| 中文在线免费一区三区| 久久久久免费网| 日韩国产一区二区| 色哟哟免费网站| 一本久久综合| 成人免费在线观看视频网站| 国产美女久久久久| av无码av天天av天天爽| 国产精品日日摸夜夜摸av| 欧美久久久久久久久久久久| 精品女厕一区二区三区| 中文字幕第31页| 精品av久久707| 国产中文在线观看| 欧美福利视频网站| 欧美一级大片| 91麻豆蜜桃| 激情婷婷综合| 免费网站在线观看视频| 日本强好片久久久久久aaa| 日本女人黄色片| 久久久久久麻豆| 国产美女久久久久久| 欧美午夜激情在线| www.国产精品视频| 亚洲一区二区久久| 国产盗摄一区二区| 国产欧美韩国高清| 香蕉久久精品日日躁夜夜躁| dy888午夜| 日韩成人精品在线| 国产女人18毛片水真多18| 国产精品美女久久久久久2018| 国产福利久久久| 欧美日韩aaa| 欧美美乳在线| 欧美精品videosex极品1| 成人全视频免费观看在线看| 国产精品一区视频| 91精品综合久久久久久久久久久 | 日韩一级二级| 成人免费自拍视频| 欧美女王vk| 日本wwwcom| 国产综合久久久久影院| 超薄肉色丝袜一二三| 精品日韩中文字幕| 亚洲欧美高清视频| 久久天天躁狠狠躁夜夜爽蜜月| 成人激情综合| 久久精品午夜一区二区福利| 欧美成人亚洲| www.51色.com| 国产精品毛片无遮挡高清| 狠狠人妻久久久久久综合| 欧美成人高清电影在线| 精品美女在线观看视频在线观看| 日韩av免费在线观看| 欧美变态挠脚心| 久久av综合网| 不卡视频一二三| 久久久久无码国产精品| 日韩午夜激情免费电影| 国产网站在线免费观看| 国产在线视频2019最新视频| 成人免费在线播放| 欧美一级裸体视频| 国产欧美日韩视频一区二区| 无码人妻精品一区二区蜜桃色欲 | av在线网站观看| 五月天婷婷综合| 天天av天天翘| 69久久夜色精品国产69乱青草| 国产精品久av福利在线观看| 黄色成人在线免费观看| 成人三级在线视频| 国产无遮挡aaa片爽爽| 精品处破学生在线二十三| 丁香花在线高清完整版视频| 成人羞羞视频免费| 亚洲国内精品| 久久丫精品国产亚洲av不卡| 韩曰欧美视频免费观看| 可以在线观看的av| 国产精品久久久久一区二区| 欧美日韩国产在线观看网站| 好男人www社区| 国产精品美女久久久久aⅴ国产馆| 国产一区二区三区在线观看 | 日韩精品不卡| 欧美bbbbb| 最新一区二区三区| 亚洲第一男人av| 亚洲电影观看| 亚洲mv在线看| 国产精品综合在线视频| 国产无遮挡裸体免费视频| 国产婷婷97碰碰久久人人蜜臀| 国产精欧美一区二区三区蓝颜男同| 日韩av在线电影观看| 国产一区三区三区| 久久网中文字幕| 亚洲欧美国产精品| 欧美电影在线观看网站| 99热这里只有精品免费| 93久久精品日日躁夜夜躁欧美| 国产又粗又猛又黄视频| 久热在线中文字幕色999舞| 黄色欧美在线| 男人插女人下面免费视频| 综合欧美一区二区三区| 六月婷婷综合网| 国产精品999| 欧美成人一品| 这里只有久久精品| 欧美一级黄色录像| 在线人成日本视频| 在线无限看免费粉色视频| a美女胸又www黄视频久久| 亚洲视屏在线观看| 欧美激情免费观看| 成人一区而且| 小毛片在线观看| 欧美精品1区2区| 久久r热视频| wwwwww欧美| 国产精品久久久久7777按摩| 天堂在线视频观看| 成人妇女淫片aaaa视频|