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

扒一扒Bean注入到Spring的那些姿勢

開發 架構
配置文件的方式就是以外部化的配置方式來聲明Spring Bean,在Spring容器啟動時指定配置文件。配置文件方式現在用的不多了,但是為了文章的完整性和連續性,這里我還是列出來了,知道的小伙伴可以自行跳過這節。

大家好,我是三友~~

這篇文章我準備來扒一扒Bean注入到Spring的那些姿勢。

其實關于Bean注入Spring容器的方式網上也有很多相關文章,但是很多文章可能會存在以下常見的問題

  • 注入方式總結的不全
  • 沒有分析可以使用這些注入方式背后的原因
  • 沒有這些注入方式在源碼中的應用示例
  • ...

所以本文就帶著解決上述的問題的目的來重新梳理一下Bean注入到Spring的那些姿勢。

配置文件

配置文件的方式就是以外部化的配置方式來聲明Spring Bean,在Spring容器啟動時指定配置文件。配置文件方式現在用的不多了,但是為了文章的完整性和連續性,這里我還是列出來了,知道的小伙伴可以自行跳過這節。

配置文件的類型Spring主要支持xml和properties兩種類型。

xml

在XmlBeanInjectionDemo.xml文件中聲明一個class為類型為User的Bean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
">

<bean class="com.sanyou.spring.bean.injection.User"/>

</beans>

User

@Data
@ToString
public class User {

private String username;

}

測試:

public class XmlBeanInjectionDemo {

public static void main(String[] args){
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:XmlBeanInjectionDemo.xml");
applicationContext.refresh();
User user = applicationContext.getBean(User.class);
System.out.println(user);
}

}

結果:

User(username=null)

可以看出成功將User注入到Spring中,由于沒有設置username屬性值,所以是null。

properties

除了xml,spring還支持properties配置文件聲明Bean的方式。

如下,在PropertiesBeanInjectionDemo.properties文件中聲明了class類型為User的Bean,并且設置User的username屬性為sanyou。

user.(class) = com.sanyou.spring.bean.injection.User
user.username = sanyou

測試:

public class PropertiesBeanInjectionDemo {

public static void main(String[] args){
GenericApplicationContext applicationContext = new GenericApplicationContext();
//創建一個PropertiesBeanDefinitionReader,可以從properties讀取Bean的信息,將讀到的Bean信息放到applicationContext中
PropertiesBeanDefinitionReader propReader = new PropertiesBeanDefinitionReader(applicationContext);
//創建一個properties文件對應的Resource對象
Resource classPathResource = new ClassPathResource("PropertiesBeanInjectionDemo.properties");
//加載配置文件
propReader.loadBeanDefinitions(classPathResource);
applicationContext.refresh();
User user = applicationContext.getBean(User.class);
System.out.println(user);
}

}

結果:

User(username=sanyou)

成功獲取到User對象,并且username的屬性為properties設置的sanyou。

除了可以配置屬性之外還支持其它的配置,如何配置可以查看PropertiesBeanDefinitionReader類上的注釋。

圖片

注解聲明

上一節介紹了通過配置文件的方式來聲明Bean,但是配置文件這種方式最大的缺點就是不方便,因為隨著項目的不斷擴大,可能會產生大量的配置文件。為了解決這個問題,Spring在2.x的版本中開始支持注解的方式來聲明Bean。

@Component + @ComponentScan

這種方式其實就不用多說,在項目中自定義的業務類就是通過@Component及其派生注解(@Service、@Controller等)來注入到Spring容器中的。

在SpringBoot環境底下,一般情況下不需要我們主動調用@ComponentScan注解,因為@SpringBootApplication會調用@ComponentScan注解,掃描啟動引導類(加了@SpringBootApplication注解的類)所在的包及其子包下所有加了@Component注解及其派生注解的類,注入到Spring容器中。

圖片

@Bean

雖然上面@Component + @ComponentScan的這種方式可以將Bean注入到Spring中,但是有個問題那就是對于第三方jar包來說,如果這個類沒加@Component注解,那么@ComponentScan就掃不到,這樣就無法注入到Spring容器中,所以Spring提供了一種@Bean的方式來聲明Bean。

比如,在使用MybatisPlus的分頁插件的時候,就可以按如下方式這么來聲明。

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}

此時就能將MybatisPlusInterceptor這個Bean注入到Spring容器中。

@Import

@Import注解也可以用來將Bean注入到Spring容器中,@Import注解導入的類可以分為三種情況:

  • 普通類
  • 類實現了ImportSelector接口
  • 類實現了ImportBeanDefinitionRegistrar接口

普通類

普通類其實就很簡單,就是將@Import導入的類注入到Spring容器中,這沒什么好說的。

類實現了ImportSelector接口

public interface ImportSelector {

String[] selectImports(AnnotationMetadata importingClassMetadata);

@Nullable
default Predicate<String> getExclusionFilter(){
return null;
}

}

當@Import導入的類實現了ImportSelector接口的時候,Spring就會調用selectImports方法的實現,獲取一批類的全限定名,最終這些類就會被注冊到Spring容器中。

比如如下代碼中,UserImportSelector實現了ImportSelector,selectImports方法返回User的全限定名

public class UserImportSelector implements ImportSelector {

@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
System.out.println("調用 UserImportSelector 的 selectImports 方法獲取一批類限定名");
return new String[]{"com.sanyou.spring.bean.injection.User"};
}

}

當使用@Import注解導入UserImportSelector這個類的時候,其實最終就會把User注入到Spring容器中,如下測試

@Import(UserImportSelector.class)
public class ImportSelectorDemo {

public static void main(String[] args){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
//將 ImportSelectorDemo 注冊到容器中
applicationContext.register(ImportSelectorDemo.class);
applicationContext.refresh();

User user = applicationContext.getBean(User.class);
System.out.println(user);
}

}

運行結果

User(username=null)

對于類實現了ImportBeanDefinitionRegistrar接口的情況,這個后面說。

一般來說,@Import都是配合@EnableXX這類注解來使用的,比如常見的@EnableScheduling、@EnableAsync注解等,其實最終都是靠@Import來實現的。

圖片

@EnableScheduling

圖片

@EnableAsync

講完通過注解的方式來聲明Bean之后,可以來思考一個問題,那就是既然注解方式這么簡單,為什么Spring還寫一堆代碼來支持配置文件這種聲明的方式?

其實答案很簡單,跟Spring的發展歷程有關。Spring在創建之初Java還不支持注解,所以只能通過配置文件的方式來聲明Bean,在Java1.5版本開始支持注解之后,Spring才開始支持通過注解的方式來聲明Bean。

注冊BeanDefinition

在說注冊BeanDefinition之前,先來聊聊什么是BeanDefinition?

BeanDefinition是Spring Bean創建環節中很重要的一個東西,它封裝了Bean創建過程中所需要的元信息。

public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
//設置Bean className
void setBeanClassName(@Nullable String beanClassName);

//獲取Bean className
@Nullable
String getBeanClassName();

//設置是否是懶加載
void setLazyInit(boolean lazyInit);

//判斷是否是懶加載
boolean isLazyInit();

//判斷是否是單例
boolean isSingleton();

}

如上代碼是BeanDefinition接口的部分方法,從這方法的定義名稱可以看出,一個Bean所創建過程中所需要的一些信息都可以從BeanDefinition中獲取,比如這個Bean的class類型,這個Bean是否是懶加載,這個Bean是否是單例的等等,因為有了這些信息,Spring才知道要創建一個什么樣的Bean。

有了BeanDefinition這個概念之后,再來看一下配置文件和注解聲明這些方式往Spring容器注入Bean的原理。

圖片

Bean注入到Spring原理

如圖為Bean注入到Spring大致原理圖,整個過程大致分為以下幾個步驟

  • 通過BeanDefinitionReader組件讀取配置文件或者注解的信息,為每一個Bean生成一個BeanDefinition
  • BeanDefinition生成之后,添加到BeanDefinitionRegistry中,BeanDefinitionRegistry就是用來保存BeanDefinition
  • 當需要創建Bean對象時,會從BeanDefinitionRegistry中拿出需要創建的Bean對應的BeanDefinition,根據BeanDefinition的信息來生成Bean
  • 當生成的Bean是單例的時候,Spring會將Bean保存到SingletonBeanRegistry中,也就是平時說的三級緩存中的第一級緩存中,以免重復創建,需要使用的時候直接從SingletonBeanRegistry中查找

好了,通過以上分析我們知道,配置文件和注解聲明的方式其實都是聲明Bean的一種方式,最終都會轉換成BeanDefinition,Spring是基于BeanDefinition的信息來創建Bean。

既然Spring最終是基于BeanDefinition的信息來創建Bean,那么我們是不是可以跳過配置文件和注解聲明的方式,直接通過手動創建和注冊BeanDefinition的方式實現往Spring容器中注入呢?

答案是可以的。

前面說過,BeanDefinition最終會被注冊到BeanDefinitionRegistry中,那么如何拿到BeanDefinitionRegistry呢?主要有以下兩種方式:

  • ImportBeanDefinitionRegistrar
  • BeanDefinitionRegistryPostProcessor

ImportBeanDefinitionRegistrar

上面在說@Import的時候,關于導入的類實現了ImportBeanDefinitionRegistrar接口的情況沒有說,主要是因為在這里說比較合適

public interface ImportBeanDefinitionRegistrar {

default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry,BeanNameGenerator importBeanNameGenerator){
registerBeanDefinitions(importingClassMetadata, registry);
}

default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry){
}

}

ImportBeanDefinitionRegistrar中有兩個方法,方法的參數就是BeanDefinitionRegistry。當@Import導入的類實現了ImportBeanDefinitionRegistrar接口之后,Spring就會調用registerBeanDefinitions方法,傳入BeanDefinitionRegistry。

來個Demo

UserImportBeanDefinitionRegistrar實現ImportBeanDefinitionRegistrar

public class UserImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator){
//構建一個 BeanDefinition , Bean的類型為 User
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(User.class)
//設置User這個Bean的屬性username的值為三友的java日記
.addPropertyValue("username", "三友的java日記")
.getBeanDefinition();
//把User的BeanDefinition注入到BeanDefinitionRegistry中
registry.registerBeanDefinition("user", beanDefinition);
}

}

測試類

@Import(UserImportBeanDefinitionRegistrar.class)
public class UserImportBeanDefinitionRegistrarDemo {

public static void main(String[] args){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
applicationContext.register(UserImportBeanDefinitionRegistrarDemo.class);
applicationContext.refresh();
User user = applicationContext.getBean(User.class);
System.out.println(user);
}

}

結果

User(username=三友的java日記)

從結果可以看出,成功將User注入到了Spring容器中。

上面的例子中有行代碼

applicationContext.register(UserImportBeanDefinitionRegistrarDemo.class);

這行代碼的意思就是把UserImportBeanDefinitionRegistrarDemo這個Bean注冊到Spring容器中,所以這里其實也算一種將Bean注入到Spring的方式,原理也跟上面一樣,會為UserImportBeanDefinitionRegistrarDemo生成一個BeanDefinition注冊到Spring容器中。

BeanDefinitionRegistryPostProcessor

除了ImportBeanDefinitionRegistrar可以拿到BeanDefinitionRegistry之外,還可以通過BeanDefinitionRegistryPostProcessor拿到BeanDefinitionRegistry

圖片

BeanDefinitionRegistryPostProcessor

這種方式就不演示了。

手動注冊BeanDefinition這種方式還是比較常見的。就比如說OpenFeign在啟用過程中,會為每個標注了@FeignClient注解的接口創建一個BeanDefinition,然后再往Spring中的注冊的,如下是OpenFeign注冊FeignClient的部分代碼

class FeignClientsRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware, EnvironmentAware {

private void registerFeignClient(BeanDefinitionRegistry registry, AnnotationMetadata annotationMetadata, Map<String, Object> attributes){
//構建BeanDefinition,class類型為FeignClientFactoryBean
BeanDefinitionBuilder definition = BeanDefinitionBuilder.genericBeanDefinition(FeignClientFactoryBean.class);
String alias = contextId + "FeignClient";
AbstractBeanDefinition beanDefinition = definition.getBeanDefinition();
BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, className, new String[] { alias });
//注冊BeanDefinition
BeanDefinitionReaderUtils.registerBeanDefinition(holder, registry);
}
}

注冊創建完成的Bean

上一節說可以跳過配置文件或者是注解,直接通過注冊BeanDefinition以達到將Bean注入到Spring中的目的。

既然已經可以跳過配置文件或者是注解,那么我們可不可以更激進一步,跳過注冊BeanDefinition這一步,直接往Spring中注冊一個已經創建好的Bean呢?

答案依然是可以的。

因為上面在提到當創建的Bean是單例的時候,會將這個創建完成的Bean保存到SingletonBeanRegistry中,需要用到直接從SingletonBeanRegistry中查找。既然最終是從SingletonBeanRegistry中查找的Bean,那么直接注入一個創建好的Bean有什么不可以呢?

既然可以,那么如何拿到SingletonBeanRegistry呢?

其實拿到SingletonBeanRegistry的方法其實很多,因為ConfigurableListableBeanFactory就繼承了SingletonBeanRegistry接口,所以只要能拿到ConfigurableListableBeanFactory就相當于拿到了SingletonBeanRegistry。

圖片

ConfigurableListableBeanFactory類圖

而ConfigurableListableBeanFactory可以通過BeanFactoryPostProcessor來獲取

圖片BeanFactoryPostProcessor

來個Demo

RegisterUserBeanFactoryPostProcessor實現BeanFactoryPostProcessor, 往Spring容器中添加一個手動創建的User對象

public class RegisterUserBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
//創建一個User對象
User user = new User();
user.setUsername("三友的java日記");
//將這個User對象注入到Spring容器中
beanFactory.registerSingleton("user", user);
}

}

測試

public class RegisterUserDemo {

public static void main(String[] args){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
applicationContext.register(RegisterUserBeanFactoryPostProcessor.class);
applicationContext.refresh();
User user = applicationContext.getBean(User.class);
System.out.println(user);
}

}

結果

User(username=三友的java日記)

從結果還是可以看出,成功從Spring容器中獲取到了User對象。

這種直接將創建好的Bean注入到Spring容器中在Spring框架內部使用的還是比較多的,Spring的一些內建的Bean就是通過這個方式注入到Spring中的。

圖片

如上圖,在SpringBoot項目啟動的過程中會往Spring容器中添加兩個創建好的Bean,如果你的程序需要使用到這些Bean,就可以通過依賴注入的方式獲取到。

雖然基于這種方式可以將Bean注入到Spring容器,但是這種方式注入的Bean是不經過Bean的生命周期的,也就是說這個Bean中諸如@Autowired等注解和Bean生命周期相關的回調都不會生效的,注入到Spring時Bean是什么樣就是什么樣,Spring不做處理,僅僅只是做一個保存作用。

FactoryBean

FactoryBean是一種特殊的Bean的類型,通過FactoryBean也可以將Bean注入到Spring容器中。

圖片

FactoryBean

當我們通過配置文件、注解聲明或者是注冊BeanDenifition的方式,往Spring容器中注入了一個class類型為FactoryBean類型的Bean時候,其實真正注入的Bean類型為getObjectType方法返回的類型,并且Bean的對象是通過getObject方法返回的。

來個Demo

UserFactoryBean實現了FactoryBean,getObjectType返回了User類型,所以這個UserFactoryBean會往Spring容器中注入User這個Bean,并且User對象是通過getObject()方法的實現返回的。

public class UserFactoryBean implements FactoryBean<User> {
@Override
public User getObject() throws Exception {
User user = new User();
user.setUsername("三友的java日記");
return user;
}

@Override
public Class<?> getObjectType() {
return User.class;
}
}

測試

public class UserFactoryBeanDemo {

public static void main(String[] args){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
//將UserFactoryBean注入到Spring容器中
applicationContext.register(UserFactoryBean.class);
applicationContext.refresh();
User user = applicationContext.getBean(User.class);
System.out.println(user);
}

}

結果

User(username=三友的java日記)

成功通過UserFactoryBean將User這個Bean注入到Spring容器中了。

FactoryBean這中注入的方式使用也是非常多的,就拿上面舉例的OpenFeign來說,OpenFeign為每個FeignClient的接口創建的BeanDefinition的Bean的class類型FeignClientFactoryBean就是FactoryBean的實現。

class FeignClientFactoryBean implements FactoryBean<Object>, InitializingBean, ApplicationContextAware {

// FeignClient接口類型
private Class<?> type;

@Override
public Object getObject() throws Exception {
return getTarget();
}

@Override
public Class<?> getObjectType() {
return type;
}
}

getObject()方法就會返回接口的動態代理的對象,并且這個代理對象是由Feign創建的,這也就實現了Feign和Spring的整合。

總結

通過以上分析可以看出,將Bean注入到Spring容器中大致可以分為5類:

  • 配置文件
  • 注解聲明
  • 注冊BeanDefinition
  • 注冊創建完成的Bean
  • FactoryBean

以上幾種注入的方式,在日常業務開發中,基本上都是使用注解聲明的方式注入Spring中的;在第三方框架在和Spring整合時,注冊BeanDefinition和FactoryBean這些注入方式也會使用的比較多;至于配置文件和注冊創建完成的Bean的方式,有但是不多。

最后,本文所有的示例代碼地址:https://github.com/sanyou3/spring-bean-injection.git

責任編輯:武曉燕 來源: 三友的java日記
相關推薦

2018-04-03 15:42:40

2015-08-18 09:12:54

app推廣渠道

2025-06-04 01:20:00

2015-09-16 14:11:47

2022-07-11 20:46:39

AQSJava

2019-10-21 10:59:52

編程語言JavaC

2019-09-10 07:29:44

2019-02-25 22:46:39

2020-01-15 15:29:52

InnoDB數據硬盤

2015-10-15 13:38:39

2023-04-10 23:05:54

NacosOpenFeignRibbon

2015-09-16 14:04:06

大數據巨頭

2015-09-21 10:07:31

2019-01-03 11:09:19

2025-08-22 13:29:21

2017-09-07 18:45:51

C#

2022-09-30 09:40:39

智能汽車

2025-04-30 07:26:04

2015-12-15 09:51:42

大公司技術知乎

2021-05-13 05:25:16

數據分析數分培訓大數據
點贊
收藏

51CTO技術棧公眾號

精品久久无码中文字幕| 菠萝菠萝蜜网站| 成年人免费在线视频| 久久综合影音| 最新69国产成人精品视频免费| 欧美伦理片在线观看| av网站在线免费| 国产99久久久国产精品| 97精品国产97久久久久久春色| 深田咏美中文字幕| 黑人巨大亚洲一区二区久| 欧美激情在线一区二区| 91久久国产自产拍夜夜嗨| 国产在线观看免费视频软件| 欧美专区一区| 欧美日韩另类在线| 亚洲精品第一区二区三区| 91麻豆成人精品国产| 亚洲视频精品| 亚洲欧洲国产精品| 成人3d动漫一区二区三区| 日本三级视频在线播放| 成人sese在线| 国产精品久久色| 老女人性淫交视频| 亚洲裸色大胆大尺寸艺术写真| 欧美日韩一区二区在线观看| 欧美视频在线观看视频| 深爱激情五月婷婷| 久久精品国产久精国产| 国内精品免费午夜毛片| 欧美三级视频网站| 成人看片爽爽爽| 欧美在线观看视频一区二区 | 中文字幕激情小说| 天天av综合| 亚洲裸体xxxx| 亚洲美女精品视频| 激情久久99| 亚洲va欧美va天堂v国产综合| 亚洲国产一区二区在线| 香港三日本三级少妇66| 狠狠色狠狠色合久久伊人| 68精品久久久久久欧美| 东方av正在进入| 精品久久91| 日韩av中文字幕在线免费观看| 中文字幕亚洲影院| 欧美大胆成人| 精品久久久久久久久久久久久久 | 国产999在线| 青青草精品在线视频| 日韩电影一区| 亚洲免费av电影| 佐佐木明希电影| 国产精品一站二站| 欧美日韩激情在线| 日本久久久精品视频| 成人影音在线| 亚洲一区二区av电影| 椎名由奈jux491在线播放 | 日韩中文字幕在线播放| 色婷婷在线影院| 少妇精品导航| 亚洲国产婷婷香蕉久久久久久| 性生交大片免费看l| 精品国产第一国产综合精品| 欧美日韩国产影片| 伊人网在线综合| 成人免费毛片嘿嘿连载视频…| 色哟哟一区二区在线观看| www插插插无码视频网站| 色老头在线观看| 亚洲黄色小说网站| 国产树林野战在线播放| 国产乱色在线观看| 亚洲欧美日本在线| 永久免费在线看片视频| 草莓福利社区在线| 一区二区三区四区乱视频| 99热一区二区三区| 污污视频在线看| 亚洲色图欧美激情| 高清无码一区二区在线观看吞精| 色呦呦网站在线观看| 亚洲一区二区成人在线观看| 免费看国产曰批40分钟| 成人va天堂| 欧美日韩一区高清| 性猛交ⅹ×××乱大交| 日韩中文影院| 欧美日韩国产一二三| 亚洲性图一区二区| 精品国产亚洲一区二区在线观看 | 丰满熟妇人妻中文字幕| 成人黄色a**站在线观看| 国产一区免费在线| 日本天堂在线| 国产精品免费久久| 免费cad大片在线观看| 爱啪啪综合导航| 欧美日韩国产综合视频在线观看中文| 国产成人无码一二三区视频| jizz欧美| 欧美v亚洲v综合ⅴ国产v| 久久久国产精品无码| 国产一区二区三区四区| 久久久精品一区| 日韩免费一二三区| 日日夜夜精品免费视频| 91香蕉视频在线下载| 三级在线播放| 亚洲桃色在线一区| 艳母动漫在线观看| 亚洲美女尤物影院| 91 com成人网| 欧美 变态 另类 人妖| 日韩黄色大片网站| 国模精品视频一区二区三区| 免费无码国产精品| 国产99一区视频免费| 热re99久久精品国产99热| a级网站在线播放| 色猫猫国产区一区二在线视频| 日韩a一级欧美一级| 亲子伦视频一区二区三区| 最新国产精品亚洲| 亚洲欧美在线视频免费| 国产又黄又大久久| 热re99久久精品国99热蜜月| 成人在线播放| 日本乱码高清不卡字幕| 久久久久亚洲AV成人网人人小说| 国产日韩欧美一区二区三区| 久久久视频精品| 中文字幕乱码视频| 26uuu欧美日本| 91午夜在线观看| 国产精品99久久免费| 精品少妇一区二区三区免费观看 | 久久国产一区二区三区| 国产成人在线视频观看| 国产麻豆精品theporn| 日韩一区二区电影在线观看| 超免费在线视频| 日韩一卡二卡三卡国产欧美| 波多野结衣喷潮| 天堂精品中文字幕在线| 久久久综合亚洲91久久98| 天天干在线视频论坛| 欧美日韩不卡在线| 亚洲自拍偷拍图| 亚洲日本欧美| 国产精品日本一区二区 | 亚洲午夜国产成人| 中日韩美女免费视频网址在线观看| 99视频在线看| 成人sese在线| 日本手机在线视频| 一区二区三区国产好| 久久在线免费观看视频| 在线播放一级片| 中文字幕高清不卡| 高清一区在线观看| 久久美女精品| 国产欧美久久久久久| 成人高清免费观看mv| 在线观看不卡视频| 日韩女同一区二区三区| 日本亚洲一区二区| 久久久精品有限公司| 午夜不卡影院| 亚洲欧美日韩另类| 无码人妻丰满熟妇区bbbbxxxx| 91免费观看在线| 日韩在线综合网| 亚州综合一区| 国产精品日韩在线观看| 日本美女在线中文版| 欧美一卡2卡三卡4卡5免费| 中文字幕资源站| 国产一区二区三区精品视频| 真人做人试看60分钟免费| 免费一级欧美片在线观看网站| 在线观看欧美www| 国产精品久久久久久久久久久久久久久久久久 | 偷拍欧美精品| 91香蕉亚洲精品| 午夜激情在线| 日韩精品高清视频| av图片在线观看| 欧美激情一区二区三区| 天堂av8在线| 狠狠爱成人网| 蜜桃精品久久久久久久免费影院| 激情开心成人网| 色爱精品视频一区| 亚洲国产精品欧美久久| 岛国av午夜精品| 国精产品一区一区| 国产精品一区二区久久精品爱涩| 精品无码国模私拍视频| 国产日产精品一区二区三区四区的观看方式 | 九色综合婷婷综合| 深夜视频一区二区| 欧美日韩第一页| 黄色在线网站| 欧美日韩一二三区| 欧美日韩大片在线观看| 久久日一线二线三线suv| 亚洲精品成人在线播放| 亚洲三级网站| 中文字幕黄色大片| 奇米影视777在线欧美电影观看| 国产精品永久在线| 人妖欧美1区| 一本一本久久a久久精品牛牛影视| 国产不卡精品视频| 在线视频你懂得一区| 国产精品久久久精品四季影院| 99精品视频一区| 永久免费的av网站| 在线综合亚洲| 性欧美精品一区二区三区在线播放| 欧美成人精品午夜一区二区| 日韩美女在线播放| 日本动漫同人动漫在线观看| 伊人久久五月天| 丰满大乳国产精品| 欧美精选午夜久久久乱码6080| 日韩大片免费在线观看| 日韩理论片网站| 亚洲a v网站| 懂色av一区二区三区免费看| 欧美三级午夜理伦三级富婆| 久久综合狠狠| 国产美女网站在线观看| 欧美精品大片| 黄色免费高清视频| 国产探花一区在线观看| 国产一区二区三区四区五区加勒比 | 91精品丝袜国产高跟在线| 国产福利视频一区二区| 黄色在线网站噜噜噜| 欧美大片va欧美在线播放| jizz在线观看视频| 亚洲一区二区久久久| 天堂视频中文在线| 亚洲国产高清高潮精品美女| 97成人在线观看| 欧美在线一区二区| 一级成人黄色片| 亚洲国产wwwccc36天堂| 婷婷色中文字幕| 亚洲日穴在线视频| 超薄肉色丝袜一二三| 国产夜色精品一区二区av| 黄色片视频免费观看| 成人免费视频一区| 中文字幕天堂网| 成人美女视频在线看| 91传媒理伦片在线观看| 国产成人在线视频网址| 香港三日本8a三级少妇三级99| 成人app下载| 97人妻精品一区二区免费| 中文字幕精品一区二区精品绿巨人 | 国产精品三级| 一区二区在线观看网站| 国产一区二区三区四区老人| heyzo亚洲| 日本欧美一区二区三区乱码| 亚洲网中文字幕| 成人av在线网站| 欧美熟妇激情一区二区三区| 亚洲色图欧美偷拍| 日韩特黄一级片| 欧美三级日韩三级国产三级| 国产人妻精品一区二区三区| 亚洲二区中文字幕| av在线电影院| 欧美成人免费全部| 在线观看的黄色| 国产有码在线一区二区视频| 丁香5月婷婷久久| 神马影院我不卡午夜| 午夜精品电影| 人妻无码视频一区二区三区| 国产精品夜夜嗨| 97人妻精品一区二区免费| 亚洲码国产岛国毛片在线| 日本免费观看视| 91精品国产综合久久国产大片| 日韩专区第一页| 俺也去精品视频在线观看| av资源在线| 91亚洲精品一区| 你微笑时很美电视剧整集高清不卡 | 日本黄色一级网站| 久久精品男人的天堂| 久久综合综合久久| 欧美日韩在线播放一区| 手机看片一区二区| 久久av.com| 免费在线观看一区| 国产亚洲情侣一区二区无| 99久久婷婷| 少妇激情一区二区三区| av毛片久久久久**hd| 欧美第一页在线观看| 在线观看欧美黄色| 天天操天天插天天射| 欧美成人亚洲成人| 欧美日韩伦理一区二区| 欧美欧美一区二区| 一区二区三区四区五区在线| 日本少妇一区二区三区| 中日韩免费视频中文字幕| 天堂网一区二区三区| 欧美大片免费久久精品三p | 久久久久国产视频| 国产不卡精品| 亚洲午夜在线观看| 天堂va蜜桃一区二区三区漫画版| 亚洲无人区码一码二码三码| 亚洲女性喷水在线观看一区| 国产一区二区视频免费| 日韩成人av在线| av小说在线播放| 电影午夜精品一区二区三区| 久久精品国内一区二区三区水蜜桃| 91热这里只有精品| 国产三级一区二区三区| 丰满人妻老熟妇伦人精品| 亚洲精品美女在线| 国产伦子伦对白在线播放观看| 国产高清自拍一区| 亚洲婷婷免费| 制服丝袜在线第一页| 亚洲国产欧美在线| 少妇av在线播放| 97在线观看视频| 日韩影视在线观看| 欧美日韩中文在线视频| 91色在线porny| 久久久久久少妇| 国产视频久久网| 综合在线影院| 一本色道久久99精品综合| 久久电影网电视剧免费观看| 国产精品视频看看| 91精品免费观看| 在线看女人毛片| 国产专区一区二区| 国产精品毛片| 在线免费观看视频| 欧美日韩国产123区| 天堂а√在线官网| 99久久精品久久久久久ai换脸| 黄色综合网站| brazzers精品成人一区| 欧美影片第一页| 激情在线小视频| 国产精品视频入口| 快she精品国产999| 成人18视频免费69| 日韩欧美国产三级| 亚洲日本天堂| 一本色道婷婷久久欧美 | 欧美乱熟臀69xxxxxx| 在线播放蜜桃麻豆| 九九九九精品| 日韩av在线免费观看不卡| 日韩在线一卡二卡| 精品国产网站在线观看| 欧美日韩五码| 欧美性受黑人性爽| kk眼镜猥琐国模调教系列一区二区| 精品国产乱子伦| 久久国产精品久久久| 青青一区二区| mm131亚洲精品| 午夜久久久影院| 日本高清中文字幕在线| 国产精品大全| 日本91福利区| 日韩免费一二三区| 日韩在线观看你懂的| 成人免费在线电影网| 欧美成年人视频在线观看| 亚洲妇女屁股眼交7| 亚洲麻豆精品| 精品伦精品一区二区三区视频 | 91亚洲一线产区二线产区 | 中文字幕视频在线免费观看| 亚洲精品乱码久久久久久久久| 久久国产精品高清一区二区三区| 亚洲一区二区免费| 久久黄色网页| 久久亚洲av午夜福利精品一区|