日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring知识概要

發布時間:2025/3/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring知识概要 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

文章目錄

  • **Spring基礎**
  • **Spring容器**
  • **Spring創建Bean的3種方式**
  • **Spring容器中Bean的作用域**
  • **Spring核心機制:依賴注入**
      • **1.注入方式**
      • **2 各種注入示例**
  • **Spring的組合屬性**
  • **Spring的Java配置管理**
  • **深入理解Spring容器中的Bean**
      • 1. 抽象Bean
      • 2. 繼承Bean
      • 3 .Spring中Bean的繼承與Java中類的繼承的區別:
      • 4.工廠Bean
  • **Spring中Bean的生命周期**
  • **Spring的其他依賴配置**
      • 1. 使用PropertyPathFactoryBean獲取其他Bean的屬性值
      • 2. 使用FieldRetrivingFactoryBean獲取其他Bean的Field值
      • 3. 使用MethodInvokingFactoryBean獲取其他Bean的方法的返回值
  • **Spring基于xml Schema的簡化配置**
      • 1. p:命名空間
      • 2. c:命名空間
      • 3. util命名空間
      • 4.Spring的其他簡化配置的schema
  • **spring的兩種后處理器**
      • 1. Bean后處理器
      • 2. 容器后處理器
      • 3.容器后處理器之屬性占位符配置器
      • 4.容器后處理器之重寫占位符配置器
  • **Spring 注解之零配置**
      • 1.指定SpringBean的注解
      • 2.搜索Spring Bean
      • 3.配置依賴的@Resource注解
      • 4.指定Bean作用域的@Scope注解
      • 5 定制SpringBean生命周期行為的注解
      • 6 自動裝配和精裝配的注解
      • 7 Spring的其他注解
  • **Spring的AOP**
    • **1 基于注解管理的AOP**
    • **2基于xml配置的AOP**
  • **Spring的事務**
    • 1. Spring支持的事務策略
      • 1.1 全局事務
      • 1.3 PlatformTransactionManager
    • 2 Spring的兩種事務管理方式
    • 3 spring事務的傳播屬性
  • Spring補充知識
    • ApplicationContextAware
    • 注解@ControllerAdvice

Spring基礎

  • 基本上所有的框架都是提取實際開發中大量重復步驟而成
  • 圍繞Spring框架,還衍生出了如Spring Web Flow、Spring Security等框架
  • Spring框架優點
    1) 低侵入式,代碼污染低
    2) 獨立于各種應用服務器
    3) IOC降低了業務對象替換的復雜性,降低了組件之間的耦合
    4) AOP支持通用任務如日志、事務、安全等的集中處理
    5) ORM和DAO提供了與第三方持久框架的良好整合,并簡化了底層數據庫的訪問
    6) 開發者可自由選擇Spring框架的部分或全部,不像有些框架得全部引用
  • Spring容器(Spring Core Container)是Spring的核心機制,它主要由以下4個包和其子包組成:
    a) org.springframework.core
    b) org.springframework.beans
    c) org.springframework.content
    d) org.springframework.expression
    spring容器還依賴于common-logging 這個JAR包
  • Spring容器中的Bean是一個泛化概念,只要是一個Java類就可當成Bean。Spring容器使用xml配置文件來管理這些Bean,所以配置到XML文件中的Bean,Spring容器就可管理它。
  • 一個對象需要調用另一個對象的情形就可稱為依賴
  • Spring容器利用XML配置文件管理Bean的原理
    我們將Bean配置在XML文件里后,在創建Spring容器后,Spring容器就開始解析Xml文件。當解析到<bean…/>元素里class屬性的完整類名時,就會利用反射機制實例化一個對象,當解析到<property…/>元素時,就會執行該對象的setter方法,其中name屬性決定執行哪個setter方法,value或ref屬性決定setter方法的傳入參數。最后在完成注入后,將<bean…/>元素里的id屬性值和創建的對象以鍵值對的形式存在Spring容器中,這樣Spring容器就可管理Bean了。
  • XML配置文件中<property…/>元素什么時候用value屬性,什么時候用ref屬性?
    a) 當傳入參數是基本數據類型或String類型時用vlaue
    b) 當傳入參數是其他Bean時,則用ref(即引用類型用ref)
  • 如何訪問Spring容器中的Bean?
    常用ApplicationContext接口的實現類來獲取,該接口主要有以下兩個方法:
    a) Object getBean(String name):獲取容器中id為name的Bean實例
    b) T getBean(String id,Class<T> type):根據id名和Bean類型獲取該Bean
    ApplicationContext接口的主要實現類:
    a) ClassPathXmlApplicationContext :從類加載路徑下搜索配置文件
    b) FileSystemXmlApplicationContext:從文件系統的相對或絕對路徑下搜索配置文件
    c) AnnotationConfigWebApplicationContext:使用注解替換xml配置文件時使用【單測時用比較方便】
    示例:
  • ApplicationContext app = new ClassPathXmlApplicationContext(“beans.xml”); User user = (User) app.getBean(“user”)

    10.總結
    有了spring后,程序可不再使用new來創建對象了

    Spring容器

  • 由前面了解到,Spring容器是利用xml配置文件來生產并管理Bean的,而訪問Spring容器中的Bean利用了Application接口,所以我們用該接口來代表Spring容器。實際上,ApplicationContext的父接口BeanFactroy也可代表Spring容器,但我們一般不用它作為Spring容器,除非應用對內存非常關鍵。
  • ApplicationContext容器接口 除有BeanFactory全部功能以外,還有以下功能:
    a) 在創建容器時就初始化容器中的Bean,可通過<bean…/>元素的lazy-init=”true”取消
    b) 因繼承了MessageSource接口所以支持國際化
    c) 支持資源訪問,如URL和文件
    d) 支持事件機制
    e) 可同時加載多個配置文件
    f) 能通過聲明方式啟動并創建Spring容器
  • ApplicationContext接口的實現類
    a) 常用實現類:
    ClassPathXmlApplicationContext:從類加載路徑下搜索配置文件
    FileSystemXmlApplicationContext:從文件系統的相對或絕對路徑下搜索配置文件
    AnnotationConfigApplicationContext:使用Java配置替換xml配置文件時使用
    b) 在web應用中常用的實現類:
    XmlWebApplicationContext:
    AnnotationConfigWebApplicationContext:使用注解替換xml配置文件時使用
  • 編程式實例化ApplicationContext
    ApplicationContext app = new ClassPathXmlApplicationContext(“beans.xml”);
  • 聲時式創建并啟動Spring容器(ApplicationContext)
  • 當beans.xml文件放在WEB-INF下時,只需在web.xml中配置:
  • <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
  • 當beans.xml放在src目錄(即classpath)下時,則需在web.xml當中配置:
  • <context-param><!-- 加載spring容器:單詞不能寫錯 --><param-name>contextConfigLocation</param-name><param-value>classpath: beans.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>

    當有多個配置文件時,可在classpath后面使用通配符“*”

    Spring創建Bean的3種方式

  • Spring創建Bean的3種方式
    a) 調用構造器
    b) 調用靜態工廠方法
    c) 調用實例工廠方法
  • 使用靜態工廠方法
  • 此時<bean…/>元素需要指定以下兩屬性
    a) class:指定靜態工廠類的類名
    b) factory-method:指定創建實例的靜態工廠方法
  • 示例
  • public class Dog implements Animal{ //要求類化的類private String msg;public void setMsg(String msg){this.msg = msg;}public void eat(){System.out.print(msg);} } public class Dog AnimalFactory{ //靜態工廠類代碼public static Animal getAnimal(String name){if(“dog”.equalsIgnoreCase(name)){return new Dog();}else{return new Cat();}} } //對應配置文件 <bean id="dog" class="com.dfsj.AnimalFactory" factory-method=”getAnimal”><constructor-arg value="dog"/><property name="msg" value="我是狗"/>></bean>

    需要注意的是,靜態工廠方法的參數通過<constructor-arg…/>元素配置,而新建對象的屬性的值通過<property…/>元素設置

    3.使用實例工廠方法創建Bean時,<bean…/>元素需要指定如下兩屬性:
    a) factory-bean:指定工廠類實例,即工廠類在配置文件中的id
    b) factory-method:指定實例工廠創建實例方法

    4.靜態工廠方法與實例工廠方法的區別:
    不同點:
    a) 靜態工故事有class屬性,指定的是靜態 工廠類的類名,而實例工廠是用factory-bean屬性指定工廠類在配置文件中的id
    b) 靜態工廠方法創建Bean實例的方法是靜態的
    相同點
    a) 都需要用factory-method指定創建Bean實例的方法
    b) 工廠方法里的參數都必須通過<constructor-arg…/>元素來配置
    c) 給新創建的Bean實例的屬性賦值,都是用<property…/>元素

    Spring容器中Bean的作用域

    1. Spring容器的bean的作用域通過sope屬性指定

    <bean id=”test” class=”com.dfsj.Test” scope=”prototype”>
  • 常用的兩個作用域
    a) singleton:在IOC容器中只生成一個實例
    b) prototype:每次通過容器的getBean()方法獲取該作用域的Bean時,都將產生一個新的實例
  • 只在web項目中有效的幾個作用域
    a) reqeust:對于一次http請求,該作用域下的Bean只生成一個實例
    b) session:對于一次會話,只生成一個實例
    c) global session:在全局會話,里生成一個實例
  • 在web.xml中配置使request作用域生效的Listener
  • <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener>

    5 注
    在springMVC框架中,已有SpringDispatherServlet或DispatherServlet來攔截處理所有和請求有關的狀態處理,所以不需要如編號4的Listerner配置。

    6. 這里的bean的作用域具體指的是什么?
    如果一個bean的scope屬性設置為singleton,則表示在整個IOC容器內,在注入到其他對象中時,只要唯一確定是該bean(可通過id確定),則都會是同一個bean,而不是去重新new一個新的bean對象。
    如果一個bean的scope屬性設置為prototype,則表示在注入到其他對象中或用getBean方法得到時,雖然指向的是同一個bean,但都會重新new一個新的對象。

    Spring核心機制:依賴注入

    1.注入方式

  • 設值注入
  • <bean id=”user” class=”com.app.User”><property name=”name” vlaue=”張三”/><property name=”age” vlaue=”30”/> </bean>

    2.構造注入

    <bean id="test" class="com.test.Test"><property name="name" value="Peter"/> <constructor-arg ref="person"/><constructor-arg value="張三" type="String"/> </bean> 構造注入的參數序安出現的順序為準,除非以index屬性指定(下標從0開始)

    3.在使用spring框架時,眼睛看到xml配置時,心中要想到底層Java代碼是如何實現的,用得熟練時,看到任何一段Java代碼都能用xml文件配置也來

    2 各種注入示例

  • 以參數下標方式配置有參構造,不指定index時,以出現順序注入
  • <bean id="test" class="com.test.Test">< constructor-arg index=”0” value="ddd"/> <constructor-arg index=”1” value=”44”/> </bean>

    2.注入基本數據類型

    <bean id="test" class="com.test.Test">< property name=”name” value="ddd"/> < property name=”age” value="30"/> </bean>

    3.注入其他Bean

    <bean id="dog" class="com.test.Dog"> <bean id="test" class="com.test.Test">< property name=”dog” ref="dog"/> </bean>

    4.注入嵌套Bean

    <bean id="test" class="com.test.Test">< property name=”cat” > <bean class=”com.test.Cat”></property> </bean>

    5.注入Map集合
    entry元素有4個屬性:
    key:當key值是基本數據類型或字符串類型時使用
    key-ref:當key值是引用類型時使用
    value:當value值是基本數據或字符串類型時使用
    value-ref:當value值是引用類型時使用
    示例:給private Map<String,Axe> axes注入

    <bean id="test" class="com.test.Test">< property name=”axes” > <map><entry key=”name” value=”張三”/></map></property></bean>

    6.注入數組(與注入List集合一樣):如給private String[] cities;注入

    <bean id="test" class="com.test.Test">< property name=”cities” > <list>< value=”北京”/>< value=”重慶”/></list></property> </bean>

    7.注入List集合:如給private List<String> cities;注入

    <bean id="test" class="com.test.Test">< property name=”cities” > <list>< value=”北京”/>< value=”重慶”/></list></property> </bean>

    8.注入Properties集合(Properties類實現了Map接口)

    <bean id="test" class="com.test.Test">< property name=”health” > <props><prop key=”血壓” >正常</prop><prop key=”身高” >175</prop></props></property></bean>

    9.注入Set集合:如給private Set set注(因為泛型,所以可以注入各種類型的)

    <bean id="test" class="com.test.Test">< property name=”set” > <set>< value>普通字符串< value/> //基本數據類型或字符串<bean class=”com.test.User”> //嵌套Bean<ref brean=”stoneAxe”> //容器中的其他Bean<list> //List集合< value>20< value/><set>< value>30< value/></set></list></set></property> </bean>

    10.當<list…/>、<set…/>、<map…/>這些元素在配置注入時,如果這些集合未泛型,則其值可以是基本數據類型、字符串、容器中其他Bean、嵌套Bean、集合等各種數據類型,如上面Set集合注入的示例

    Spring的組合屬性

    1. 所謂組合屬性,就是一個類的屬性還有自己的屬性。因為涉及到調用,所以在使用組合屬性時,除最后一個屬性外,前面調用者都不能為空。
    2. 示例

    Java代碼: public class Test{ private Person person = new Person; //這里一定要new//….getter 、setter方法 } 對應配置代碼: <bean id="person" class="com.test.Person" /> <bean id="test" class="com.test.Test">< property name=”person.name” value=”張三” > </bean>

    3.Spring中的Bean與Java的Bean的區別

  • 寫法不同:
    傳統的JavaBean作為對象,要求每個屬性都必須提供getter setter方法,而SpringBean只需要為接受設值注入的屬性提供setter方法即可,但是如果要獲取該屬性值,還是需要寫getter方法的
  • 生命周期的不同:
    傳統的JavaBean不接受容器的管理,而SpringBean是由spring容器管理它的生命周期和行為的
  • Spring中的Bean即使有"有參構造函數,最好也提供無參構造函數
  • Spring的Java配置管理

    Spring的Java配置管理,代替了之前的xml文件配置管理
    1. 實現
    1)利用**@Configuration注解修飾的類(后面就叫配置類)代替xml文件
    2)有
    @Bean**注解修飾一個方法,該方法的返回的對象將定義成容器中的Bean
    3)用@Value注解修飾一個Field,相當于配置一個變量
    2. 示例

    @Configuration public class AppConfig{ @Value("張三") String personName;@Bean(name="chinese")public Person getPerson(){Chinese c = new Chinese();c.setAxe(getStoneAxe ()); // 獲取stoneAxe對象并注入c.setName(personName);return c;}@Bean(name="stoneAxe")public Axe getStoneAxe(){return new StoneAxe();} }

    3.Java配置管理時創建容器

    ApplicationContext app = new AnnotationConfigApplicationContext(AppConfig.class);

    如果是web應用,則用AnnotationConfigWebApplicationContext創建
    4.XML配置管理與Java配置管理的混用
    1)在xml配置文件中導入Java配置類

    <bean class="com.dfsj.util.AppConfig">

    2)在Java配置類里導入xml配置文件

    @Configuration @ImportResource("classpath:/beans.xml") public class AppConfig{ //…. }

    5.Java配置類的其他注解
    1)@Import:修飾Java類,用于導入其他Java配置類
    2)@Scope:修飾創建Bean的方法,用于指定生成的Bean的作用域
    3)@Lazy:修飾創建Bean的方法,用于指定生成Bean是否延遲初始化
    4)@DependsOn:修飾創建Bean的方法,用于指定在初始該方法前要初始化的其他Bean

    深入理解Spring容器中的Bean

    1. 抽象Bean

    1)抽象Bean由<bean.../>元素的abstract="true"屬性指定,如:

    <bean id="test" abstract="true"><property name="username" value="peter"/><property name="age" value="peter"/> </bean>

    從上面示例中可以看到,并沒有用class屬性指定類,這是為什么呢?
    因為我們知道,抽象Bean是不可被實例化的,即便指了類的完整名也不會用到,還有就是,Spring中的Bean的繼承是對象與對象之間的關系,而不是類與類之間的關系,只存在參數之間的傳遞,所以抽象類須指定參數。抽象類的屬性值,在子類當中也能獲取到。

    2. 繼承Bean

    1)在Spring中,Bean的繼承是由parent屬性指定的,如:

    <bean id="son" class="com.dfsj.Son" parent="test"> parent指定的值是父類在容器中的id

    2)當子類信息與父類信息不一致時,子類的覆蓋父類的
    3)子類無法從父類繼承這些屬性:depends-on、autowire、singleton、scope、lazy-init

    3 .Spring中Bean的繼承與Java中類的繼承的區別:

    1)前者是對象與對象之間的關系,后者是類與類的關系
    2)前者主要表現為參數值的延續,后者主要是方法、屬性的延續
    3)Spring中的Bean不可作為父Bean使用,而Java中子類可以當成父類實例使用

    4.工廠Bean

    詳情參見P580-P582
    1.工廠Bean是實現FactoryBean接口的Bean

    2.FactoryBean接口提供了如下幾個方法:
    (1) T getObject():返回該工廠的自定義內容
    (2) class<?> getObjectType():返回該工廠自定義內容(java實例)的類型(實現類)
    (3) boolean isSingleton():返回自定義的java實例是否為單例模式

    3.工廠Bean配置在xml文件后,通過Spring容器的getBean()方法獲取時,得到的不是該Bean的實例,而是由開發者在getOject()方法里自定義的返回值,可能是一個數字,也可能是一個字符串,也可能是一個對象,所以此時配置工廠Bean時的id屬性指定的是getObject方法返回值在容器中的唯一標識。

    4.如何返回工廠Bean本身?
    當我們在用Spring容器的getBean()方法獲取工廠Bean時,在id前面加上"&"符
    號即可,如:

    ApplicationContext app = new ClassPathXmlApplicationContext("beans.xml"); app.getBean("&factoryBeanId");

    5.強制初始化其他Bean
    如果某個類的初始化塊中使用了其他Bean,則這種依賴不夠直接,當spring初始主調Bean時,可能會由于初始化塊中的其他Bean還未被初始化,則會拋出像空指針之類的異常。這時我們可通過depends-on屬性在初始化主調Bean前強制先初始化其他Bean,如:

    <bean id="person" class="com.test.Person" /> <bean id="test" class="com.test.Test" depends-on="person" />

    Spring中Bean的生命周期

    1. prototype作用域的Bean的生命周期
    當Spring容器創建了prototype作用域的Bean實例之后,Bean實例完全交給客戶端代碼管理,容器不再跟蹤其生命周期,且每次客戶端請求該Bean時,都會新建一個實例。
    2. singleton作用域的Bean的生命周期
    每次客戶端請深圳市singleton作用域的Bean時,返回的都是同一個實例,spring容器負責跟蹤Bean實例的產生和銷毀。
    3. Spring如何管理Bean的生命周期
    1)依賴注入之后的行為,兩種方式:
    (1) 通過實現InitializingBean接口,然后利用afterPropertiesSet()方法處理
    (2) 通過<bean.../>元素的init-method屬性指定的方法處理

    <bean id="test" class="com.dfsj.Test" init-method="initMethod"><property name="username" value="peter"/> </bean> //這里的意思是,在完成Test注入之后,先執行Test里的initMethod()方法 //如果(1)、(2)兩種方式都實現了,則在依賴注入之后,先執行(1)的方法

    2)Bean銷毀之前的行為,兩種方式
    (1) 通過實現DisposableBean接口,然后利用destroy()方法處理
    (2) 通過<bean.../>元素的destroy-method屬性指定要執行的處理方法
    如果(1)、(2)兩種方式都實現了,則在依賴注入之后,先執行(1)的方法

  • 協調作用域不同步的Bean:參見P589-P591
  • Spring的其他依賴配置

    如果Spring框架用得熟練,別人給你任何一段Java代碼,你都能用spring的配置文件配置出來。前面了解了用<property.../>元素配setter方法、用<constructor-arg.../>元素配置有參構造等等,下面我們來了解下如何配一個類的setter方法、普通方法、屬性、Field
    詳情參見P592~P599

    1. 使用PropertyPathFactoryBean獲取其他Bean的屬性值

    1)PropertyPathFactoryBean屬于工廠Bean,所以獲得其他Bean的屬性值的原理就是利用工廠Bean的getObject自定義返回值實現的,示例如:

    <bean id="test" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"><!-- person是Person類在容器中的id --><property name="targetBeanName" value="person"/> <property name="propertyPath" value="name"/> </bean>

    2)解釋上面配置:給PropertyPathFactoryBean的targetBeanName屬性注入指定Bean的id,給propertyPath屬性注入指定需要返回值的屬性,通過容器獲的getBean(“test”)方法獲取的值就是Person類的name屬性的值

    3)獲取指定Bean的具體某個屬性值的簡單方式:

    <bean id="son.age" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"/>//此時容器getBean方法得這樣寫:getBean("son.age"); //son是Son類在容器中的唯一標識

    2. 使用FieldRetrivingFactoryBean獲取其他Bean的Field值

    首先要明確的是,這里所說的Field都是以public修飾的

    1)獲取靜態的Field的值,用targetClass屬性

    <bean id="test" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"><property name="targetClass" value="com.dfsj.Test"/> <property name="targetField" value="NAME"/> </bean>//或者: <bean id="test" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"><property name="targetClass" value="com.dfsj.Test"/> <property name="staticField" value="com.dfsj.Test.NAME"/> </bean>

    2)獲取實例Field,targetObject屬性

    <bean id="test" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"><property name="targetObject" ref="test"/> <property name="targetField" value="age"/> </bean>

    雖然2) 也能獲取靜態Field值,但不推薦這么用

    3. 使用MethodInvokingFactoryBean獲取其他Bean的方法的返回值

    1)獲取靜態方法返回值

    <bean id="jt" class="org.springframework.beans.factory.config. MethodInvokingFactoryBean"><property name="targetClass" value="com.dfsj.Test"/> <property name="targetMethod" value="staticMethodName"/><property name="arguments" ><list><value>"firstArgument"</value><value>"secondArgument"</value></list></property> </bean>

    2)獲取普通方法返回值

    <bean id="pu" class="org.springframework.beans.factory.config. MethodInvokingFactoryBean"><property name="targetObject" ref="test"/> <property name="targetMethod" value="staticMethodName"/><property name="arguments" value="傳一個參數" /> </bean>

    Spring基于xml Schema的簡化配置

    1. p:命名空間

    p:命名空間用于代替<property.../>元素進行設值注入
    1.語法
    1)基本數據類型屬性:p:屬性名=“值”
    2)引用類型屬性:p:屬性名-ref=“引用Bean的id”
    2.導入p:命名空間

    http://www.springframework.org/schema/p

    3.示例

    <bean id="test" class="com.dfsj.Test" p:name="peter" p:person-ref="person"/> //等價于: <bean id="test" class=" com.dfsj.Test "><property name="name" value="peter"/ ><property name="person" ref="person"/ > </bean>
  • 注意
    如果Bean的屬性名以"-ref" 結尾,那么采用p:命名空間就會發生沖突
  • 2. c:命名空間

    c:命名空間用于代替<constructorg-arg.../>元素
    1. 導入c:命名空間
    http://www.springframework.org/schema/c
    2. 語法
    index是參數下標,從0開始
    1)基本數據類型:c:構造參數名=“值” 或c:_index=“值”
    2)引用類型:c: 構造參數名-ref=“引用Bean的id” 或 c:_index-ref=“其他Bean的id”
    3.示例

    <bean id="test" class="com.dfsj.Test" c:name="jhon" c:axe-ref="stoneAxe"/> //等價于: <bean id="test" class=" com.dfsj.Test ">< constructorg-arg value="jhon"/ >< constructorg-arg ref=" stoneAxe "/ > </bean>

    3. util命名空間

    1.constant
    用于獲取指定類的靜態Field值,它是FieldRetrievingFactoryBean的簡化配置,如:

    <util:constant id="person.age" static-field="AGE" />

    2.property-path
    用于獲取指定對象的getter方法的返回值,它是PropertyPathFactoryBean的簡化,如:

    <util:property-path id="testId" path ="person.name" />
  • list
    用于定義一個List集合,支持<value.../>、<ref.../>、<bean.../>等子元素,如:
  • < util:list id="schools" list-class="java.util.LinkedList ">< value>小學</value>< value>中學</value>< value>大學</value> </ util:list >

    4.set
    用于定義一個Set集合,支持<value.../>、<ref.../>、<bean.../>等元素,如:

    < util:set id="axes" set-class="java.util.HashSet ">< value>字符串值</value><bean class=" com.test.SteelAxe "/>< ref bean="stoneAxe"/> </ util:set >

    5.map
    用于定義一個Set集合,支持<entry.../>元素定義key-value對,如:

    < util:map id="sores" map-class="java.util.TreeMap ">< entry key="數學" value="88"/>< entry key="美術" value="80"/> </ util:map >

    6.properties
    用于加載一份資源文件,并創建一個Properties實例

    < util:properties id="test" location ="classpath:myProperties.properties "/>

    4.Spring的其他簡化配置的schema

  • spring-aop-4.0.xsd :用于簡化springAOP配置
  • spring-jee-4.0.xsd :用于簡化JavaEE配置
  • spring-jms-4.0.xsd :用于簡化JMS配置
  • spring-lang-4.0.xsd :用于簡化spring動態語言 配置
  • .spring-tx-4.0.xsd :用于簡化spring事務 配置
  • spring的兩種后處理器

    Bean后處理器:對容器中的Bean進行后處理,進行額外的加強
    容器后處理器:對IOC容器進行后處理,用于增強容器的功能
    后處理器英文Post Processor

    1. Bean后處理器

  • 定義
    實現BeanPostProcessor接口的Bean就是Bean后處理器,它可對容器中的某一批Bean進行增強處理

  • BeanPostProcessor接口有如下兩個方法:
    下同的bean是要處理的Bean實例,name是該Bean配置的id
    1)Object postProcessBeforeInitialization(Object bean, String name) throws Exception
    在注入依賴之后初始化Bean之前調用

  • Object postProcessAfterInitialization(Object bean, String name) throws Exception
    如果指定了init-method屬性,則在它指定的方法之后執行
  • 兩個常見的Bean后處理器
    1)BeanNameAutoProxyCreator:根據實例Bean的name屬性創建Bean實例的代理
    2)DefaultAdvisorAutoProxyCreator:根據提供的Advisor對容器中的所有Bean他建代理

  • Bean后處理器會對容器中的所有Bean進行后處理(在方法里可過濾掉某些不需要處理的Bean),所以在配置Bean后處理器可以不用指定id。如果用BeanFactroy作為Spring容器,則程序必須先獲取Bean后處理器實例,然后手動注冊,詳情參見P617

  • Bean后處理器與其他初始化方法的執行順序
    注入完成
    Bean后處理器的postProcessBeforeInitialization方法
    InitializingBean接口的afterPropertiesSet方法
    init-method屬性指定的方法
    Bean后處理器的postProcessAfterInitialization方法

  • 2. 容器后處理器

  • 定義
    實現BeanFactoryPostProcessor接口的類就是容器后處理器,它負處理容器本身
  • BeanFactoryPostProcessor接口的方法
    void postProcessBeanFactory(ConfigurableListableBeanFactory bean) throws BeansException;
  • 常用的幾個容器后處理器
    1)PropertyPlaceholderConfigurer:屬性占位符配置器
    2)PropertyOverrideConfigurer:重寫占位符配置器
    3)CustomAutowireConfigurer:自定義自動裝配的配置器
    4)CustomScopeConfigurer:自定義作用域的配置器
  • 和Bean后處理器一樣,容器后處理器配置在Spring容器中時,如果以ApplicationContext作為Spring容器,則容器會自動檢測到容器后處理器,所以不需要配置id,但如果使用BeanFactory作為Spring容器,則必須手動注冊
  • 如果配置了多個容器后處理器,則可要求容器后處理器必須實現Ordered接口,然后指定order屬性
  • 3.容器后處理器之屬性占位符配置器

  • PropertyPlaceholderConfigurer這個屬性占位符配置器可讀取Properties文件里的鍵值對,先加載properties文件,再用EL表達式取值,如:
  • Properties文件代碼:
    username=“Peter”
    password=“123456”
  • beans.xml文件配置代碼:
  • <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="locations" > <list><!-- 如果有多個配置文件,可依次羅列出來 --><value>myPropertyFile.properties</value></list></property> </bean> <bean id="user" class="com.dfsj.User"><property name="name" > ${username} </property><property name="password" > ${password} </property> </bean>

    4.基于XML Schema的簡化配置

    <context:property-placeholder location="classpath:myPropertyFile.properties"/>

    4.容器后處理器之重寫占位符配置器

  • PropertyOverrideConfigurer這個重寫占位符配置器,較屬性占位符配置器多了一個功能,那就是Properties文件里的鍵值對的值可覆蓋spring的xml配置文件里的值,前提需要Properties文件里的鍵值對滿足以下格式:
    容器中配置的Bean的id.該Bean的屬性 = 值
  • 示例
  • //1.Properties文件代碼:user.username="peter"user.password="123456"//2.對應beans.xml代碼: <bean class=" org.springframework.beans.factory.config.PropertyOverrideConfigurer"><property name="locations" > <list><!-- 如果有多個配置文件,可依次羅列出來 --><value>myPropertyFile.properties</value></list></property> </bean> <!-- 下面Bean里的屬性注入的值會被覆蓋 --> <bean id="user" class="com.dfsj.User"><property name="name" > 張三 </property><property name="password" > 654321 </property> </bean>

    3.基于XML Schema的簡化配置

    <context:property-override location="classpath:myPropertyFile.properties"/>

    Spring 注解之零配置

    1.指定SpringBean的注解

  • 當不用xml配置文件將Java類配置成Spring容器的Spring Bean時,我們就需要以下幾個注解來指定:
    @Component :標注Java類為普通Spring Bean
    @Controller :標注Java類為控制器組件
    @Service :標注Java類為業務邏輯組件
    @Repository :標注Java類為DAO組件
  • 為指定的Spring Bean定義名字(相當于之前配置文件里的id值)
    默認spring bean的名字是對應Java類的類名小寫首字母
    自定義名字,如: @Component(“myName”)
  • 2.搜索Spring Bean

  • 當不用xml配置時,指定成Spring Bean的Java類還需要掃描搜索才能找到,這就需要在xml配置文件中指定掃描的包路徑,此時需要導入context:命名空間:
  • xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation=" http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0-xsd"<!-- 掃描下面包路徑,找到所有springBean--><context:component-scan base-package="包路徑" /> 這樣在創建Spring容器時,spring容器會掃描搜索上面路徑下的所有被標注成Springbean的Java類,然后創建對應的實例放在Spring容器中。
  • 通過為< component-scan.../>元素添加<include-filter.../>或<exclude-filter.../>元素來指定Spring Bean類,即使該Java類沒有使用Annotation
    滿足<include-filter.../>規則的Java類會被當成Spring Bean
    滿足< exclude-filter.../>規則的Java類不會被當成Spring Bean
    上面兩元素都要求指定如下兩屬性:
    type:指定過濾器類型,有4種類型:
    annotation:此時表達式需要指定一個Annotation類完整名
    assignable:此時表達式需要指定一個Java類
    regex:此時表達式需要指定.一個正則表達式
    aspectj:此時表達式需要指定一個AspectJ過濾器,如:org.example…*Service+
    expression:指定過濾器需要的表達式
    示例
  • <!-- 啟動包掃描功能,使帶有@Controller、@Service、@Repository、@Component等注解的類成為Spring容器的Bean --> <context:component-scan base-package="com.User" > <context:include-filter type="regex" expression=".*Dao"/><context:include-filter type="regex" expression=".*Service"/> </context:component-scan>

    3.配置依賴的@Resource注解

  • @Resource注解直接來源于JavaEE規范,其作用類似<property.../>元素的ref
  • @Resource注解既能修飾setter方法,也能修飾Field。若不指定name值,則默認以變量名為name值
  • 如果@Resource修飾的是接口Field,在沒有指定name時按byType方式注入,如果該接口有多個實現類時,則spring容器會因為不知具體去找哪個類而報錯。所以,如果只有其中一個實現類被指定為Spring Bean時不指定名字則不會報錯。
  • 4.指定Bean作用域的@Scope注解

  • Spring Bean的默認作用域是singleton

  • 定義Spring Bean作用域,如:

    @Scope("prototype")@Component("user")public class User { ...}
  • 自定義作用域解析器(不再基于Annotation的方法來指定作用域)
    自定義解析器類必須實現ScopeMetadataResolver接口,還要配置在< component-scan.../>元素中,如:

  • <context:component-scan base-package="包路徑" scope-resolver="自定義解析器類"/>

    5 定制SpringBean生命周期行為的注解

    @PostConstruct、@PreDestroy都直接來源于JavaEE規范,都用于修飾方法
    @PostConstruct修飾的方法在完成注入之后回調,如果被它修飾的類實現了InitializingBean接口,則@PostConstruct修飾的方法在afterPropertiesSet方法之前執行
    @PreDestroy 修飾的方法在Bean銷毀前回調執行

    6 自動裝配和精裝配的注解

  • @AutoWired注解用于自動裝配,可修飾setter方法、普通方法、Field、構造器等
  • @AutoWired注解是通過byType方式裝配注入的
  • 如果@AutoWired要裝配的是數組或集合類型對象時,spring會搜索容器中所有該類型的實例注入到其中,且集合類型時必須指明泛型。
  • 如果@AutoWired要裝配的是接口,且該接口在spring容器中有多個實例,則此時根據@AutoWired 的byType方式裝配就會拋異常了,因為spring不知道具體要裝配哪個,這時我們可以通過@Qualifier注解來精確裝配,如:
  • @Autowired @Qualifier("test") private TestInter test;

    7 Spring的其他注解

  • @DependsOn :修飾Bean類或方法,用于在初始化其修飾的Bean前強制初始化其他Bean
    @DependsOn({“chinese”,“japanese”}) //在初化Person類前初化chinese、japanese
    @ DependsOn(“chinese”) //只強制初始化一個Bean
  • @Lazy :是否要在創建Spring容器時預初始化該Bean,默認false
    @Lazy(true) :表示要延遲初始化該Bean,即不預初始化。
  • Spring的AOP

    為什么需要AOP?
    面向對象編程(OOP)里,如果有共用的代碼我們一般的做法是提取出一個公共方法供大家調用,這種方式并沒有完全解耦,比如說有一個方法之前調用過公共代碼,現需求變成該方法不需要調用公共代碼了,此時我們還得去該方法里刪除公共代碼塊。
    而面向切面編程(AOP)不止能提取出公共代碼,而且還能控制哪些方法調用該公共代碼,其他方法根本不知道發生了什么變化,這就實現了完全的解耦。所有AOP很有用。
    比如事務管理、安全檢查、緩存、對象池管理等等都是很好的AOP思想。
    spring的AOP也需要jar包:aspectjweaver.jar和aspectjtr.jar
    在Spring的AOP中,連接點(切入點)總是方法的調用

    1 基于注解管理的AOP

    1.1 使用步驟

  • 啟動@AspectJ支持
    在spring配置文件中加入下面配置:
  • <aop:aspectj-autoproxy /> //也可用以下方式啟動: <bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"/> //AnnotationAwareAspectJAutoProxyCreator是一個Bean后處理器,為spring容器中的bean生成AOP代理

    2.定義切面Bean
    定義切面Bean用@Aspect注解,如:

    @Aspectpublic class LogAspect{....}

    定義好的切面Bean也需要掃描成Spring Bean,有如下兩種方式:
    1):在切面Bean里加入@Component注解
    2):用include-filter元素:

    <context:component-scan base-package="com.*" ><context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect"/> </context:component-scan>

    3.定義一個要被增強處理的類

    @Component public class User {public void say(){System.out.println("被增強處理的方法");} }

    4.指定切入點和增強處理方法

    @Aspect @Component public class BeforeAop {//訪問修飾符public 可省略@Before("execution(public void com.User.User.say())")public void before(){System.out.println("在之前切入點之前的增強處理");} }

    execution方法是用來指定切入點的,這和AspectJ的語法一樣。
    由于通常的增強處理是對一批方法的處理,所以需要通匹配符*,如下:

    @Before("execution(* *.*(..))")

    根據Before Aop里的示例可知,第一個*表示返回值為任意類型,第二個*表示所有類,第三個*表示所有方法,括號里的…表示任意參數
    如果是某個包及其子包的所有類的所有方法都要匹配,則應如下:

    @Before("execution(* com.aops..*.*(..))")

    …代表零個或多個
    1.2 簡單示例

    //1.配置文件代碼: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"><!-- Aspectj支持 --><aop:aspectj-autoproxy /><!-- 啟動包掃描功能--><context:component-scan base-package="com.*" > <context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect" /></context:component-scan> </beans> //2. 定義增強處理的切面類和切入點@Aspect@Componentpublic class BeforeAop {@Before("execution(public void com.User.User.say())")public void before(){System.out.println("在切入點之前的增強處理");}} //3. 定義一個要被增強處理的類@Componentpublic class User {public void say(){System.out.println("被增強處理的方法");}} //4.測試:public class Test {public static void main(String[] args) {ApplicationContext app = new ClassPathXmlApplicationContext("spring.xml"); User t = (User) app.getBean("user");t.say();}}

    執行結果:
    在切入點之前的增強處理
    被增強處理的方法

    1.3 定義After增強處理

  • 示例
  • @After("execution(* *.*(..))")public void after(){System.out.println("在切入點之后處理");}

    2.After增強處理與AfterReturning 增強處理的區別:
    After增強處理不論目標方法是否正常結束,都會調用處理
    AfterReturning 只在目標方法成功完成后才處理調用
    1.4 定義AfterReturning 增強處理

  • AfterReturning增強處理是在目標方法返回值后進行增強處理,比After晚招牌處理。它用@AfterReturning注解標注,該注解有兩常用屬性:
    pointcut/value:這兩屬性作用一樣,用于指定切入點的表達式
    returning:指定一個返回值形參名,該增強處理定義的方法可通過該形參名來訪問目標方法的返回值
    還有一屬性argNames:參數列表參數名
  • 示例:
  • @AfterReturning(pointcut="execution(* *.*(..))",returning="objss") public void returnMethod(Object objss){System.out.println(objss); }

    1.5 定義AfterThrowing增強處理
    類似于AfterReturning增強處理,例:

    @AfterThrowing(throwing="ex", pointcut="execution(* *.*(..))") public void doRecoverActions(Throwable ex) { System.out.println("目標方法中拋出的異常:" + ex); System.out.println("模擬拋出異常后的增強處理..."); }

    1.6 定義Around增強處理
    Around 增強處理近似等于 Before 增強處理和 AfterReturning 增強處理的總和。它既可在執行目標方法之前織入增強操作,也可以之后織入。它既可改變執行目標方法的參數值,也可改變目標方法之后的返回值。甚至能控制目標方法什么時候執行。如:

    @Around("execution(* com.aops.User.getHeight(..))") public Object around(ProceedingJoinPoint joinPoint) throws Throwable{System.out.println("---around開始-------");Object[] arg = joinPoint.getArgs();//獲得要傳給目標方法的所有參數argArray[0] = "改變第一個參數的值";//改變傳入目標方法的參數Object o = joinPoint.proceed(arg);//調用目標方法,并得到返回值System.out.println(obj);//打印返回值 System.out.println(argArray.toString());//打印參數System.out.println("---around結束-------");return o+"調用目標方法得到的結果";//改變調用目標方法的返回值 }

    ProceedingJoinPoint是JointPoint的子類,其他增強處理的方法里如要想獲得傳入參數就得通過JointPoint的getArgs方法。
    注:只有Around增強處理能改變目標方法參數。

    1.7 相同增強處理執行順序
    1、如果是同一個切面類里有兩個相同的增強處理在同一個連接點被織入時,Spring Aop將隨機織入這兩個增強處理。
    2、 如果是兩個切面類里有相同的增強處理在同一個連接點被織入時,具有高優先級的增強處理將先被織入。
    3、指定優先級的兩個方法:
    1)讓切面類實現org.springframework.core.Ordered接口,然后實現int getOrder()方法,該方法的返回值越小,優先級越高
    2)用@Order注解修飾切面類,此時可指定一個int型的value,值越小優先級越高

    1.8定義切入點
    AspectdJ和Spring都允許定義切入點,即為一個切入點表達式起一個名字,從而允許在多個增強處理中能重復調用。
    1、定義:用@Pointcut注解修飾一個返回類型為void的空方法,方法名即為切入點名字。

    @Pointcut("execution(* *.*(..))") public void myPointcut(){ }

    如果希望該切入點只能在本切面類使用,則需將public改為private
    2、引用:
    1) 在同一個切面類里可直接引用,如:

    @After(value="myPointcut()") public void after(){ System.out.println("after......"); }

    2) 如果是引用不同切面類里的切入點,則需要加上其他切面類的類名,如:

    @After(value="OtherAdvice.myPointcut()") public void after(){System.out.println("after......"); }

    1.9 切入點指示符

  • execution:匹配執行方法的連接點,格式如下:
    execution(訪問修飾符 目標方法返回值類型 目標所屬類.目標方法名(形參列表)目標拋出異常)
    execution(public * * (…)) //匹配任意public方法
    execution(* set*(…)) //匹配任何方法名以set開始的方法
    execution(* com.aop.User.(…)) //匹配User類的所有方法
    execution( com..(…)) //匹配一個包中任意類的任意方法
  • within:限定匹配特定類型的連接點
    within(com.aop.) //匹配aop包中的任意方法
    within(com.aop…) //匹配aop包及其子包的任意方法
  • this:匹配AOP代理
    this(com.aop.UserInter) //匹配AOP實現UserInter接口,注意是AOP,不太理解
    4.target:匹配目標對象必須是指定類型
    target(com.aop.User)
  • args:對連接點(目標方法)的參數類型進行限制
    args(java.lang.String) //只匹配傳入參數是String類型,且只傳一個參數的所有目標方法
    這與execution(* *(java.lang.String))不同,execution里表示只匹配只包含一個String類型形參的方法
    6.bean:只匹配指定Bean實例的目標方法
    bean(*Service) // 匹配名字以Service結尾的bean實例
    其中名字是Bean的id或name
    1.10 切入點組合表達
    &&:同時匹配
    ||:只需要滿足一個切入點表達式即可
    !:匹配不是該切入點表達式的其他連接點
    示例:
  • @Aspect @Component public class BeforeAop {@Before("execution(!public void com.User.User.*())")public void before(){System.out.println("在切入點之前的增強處理");} }

    只要不是User類的目標方法都能被匹配

    2基于xml配置的AOP

    不推薦使用XML配置方式,推薦使用@Aspect
    2.1 注意
    1、基于注解的AOP配置能被Spring AOP和AspectJ同時支持
    2、使用 <aop:config…/>元素可能與Spring的自動代理方式沖突,因此,要么全部使用<aop:config…/>配置方式,要么全部使用自動代理方式,不能二者混用
    3、XML配置方式僅支持”singleton”的切面Bean,不能在xml中組合多個命名連接點的聲明
    4、XML配置方式時,所有關于AOP的信息都必須配在<aop:config…/>元素中
    5、如果<aop:config…/>元素里同時有<aop:pointcut…/>、<aop:advisor…/>、<aop:aspect…/>元素時,必須是pointcut、advisor、aspect這樣的出現順序。
    6、如果是要增強處理一個有返回值的目標方法,則對應切面類的增強方法也必須寫上返回值,否則系統一直處于等待狀態中。
    7、XML方式的組合運算符:and(相當于&&)、or(相當于||)、not(相當于!)
    8、遺留問題:<aop:advisor…/>是什么?跟spring自動代理有什么關系?什么是自動代理?
    2.2 示例與說明
    1、切面類:

    public class AspectAdvice {public void after(){System.out.println("調用目標方法結束后回調用,無論成與否");} public void before(){System.out.println("before......");} public Object afterReturning(Object obj){System.out.println("成功返回后回調"+obj);return obj;} public Object around(ProceedingJoinPoint jp) throws Throwable{System.out.println("調用目標方法前執行增強處理...");Object[] arg =jp.getArgs(); //得到目標方法的形參列表Object obj = jp.proceed(arg); // 調用目標方法System.out.println("調用目標方法這后執行的增強處理..."); return obj;} }2、配置文件: <!-- 注入切面類 --> <bean id="advice" class="com.aops.AspectAdvice" /> <aop:config><!-- 配置切入點,該配置一定要出現在aop:aspect前面 --><aop:pointcut id="myPointcut" expression="execution(* com.aops.User.getHeight(..))"/><!-- order屬性指定優先級,值越小,優先級越高 --><aop:aspect id="aspect" ref="advice" order="1"><!-- method屬性指定調用切面類的哪個增強方法 --><aop:after method="after" pointcut="execution(* com.aops.User.*(..))"/><!-- pointcut屬性指定切入表達式 --><aop:before method="before" pointcut="execution(* com.aops.User.*(..))"/><!-- returning指定接收返回參數的參數名 --><aop:after-returning returning="obj" pointcut-ref="myPointcut" method="afterReturning"/><!-- pointcut-ref屬性指定配置的切入表達式id --><aop:around method="around" pointcut-ref="myPointcut"/> </aop:aspect> </aop:config>

    注:當<aop:pointcut…/>元素是<aop:aspect >的子元素時,說明該切入點只能被當前切面類使用

    Spring的事務

  • 對于不同的持久層訪問技術,編程式事務提供了一致的事務編程風格,通過模板化操作一致地管理事務。
  • 聲明式事務是基于AOP實現的
  • 傳統的事務編程與具體的事務操作代碼耦合,如果切換事務策略時,必須手動更改代碼,而使用Spring管理策略時則就會
  • Spring的事務機制是一種典型的策略模式,它本身沒有任何事務支持,只是負責包裝底層的事務
  • 1. Spring支持的事務策略

    spring各種全局事務、局部事務示例配置,參見P683-P685

    1.1 全局事務

  • 全局事務由應用的服務器管理,需要底層服務器支持JTA(Java Transaction API)
  • 全局事務可以跨多個事務性資源(典型的例子是關系數據庫和消息對列)
  • 不論采用哪種持久層訪問技術,只要使用JTA全局事務,Spring事務管理的配置就完全一樣,都采用全局事務管理策略。
    ###1.2 局部事務
  • 局部事務與底層采用的持久化技術有關,當采用了JDBC持久化時,需要用Connection對象來操作事務,當采用了Hibernate持久化時,需要用Session對象來操作事務。
  • 由于局部事務事務不需要應用服務器參與事務管理,所以不能保證跨多個事務資源的事務的正確性,但實際情況是,大部分應用都是使用單一的事務性資源
  • 1.3 PlatformTransactionManager

  • Spring事務策略是通過PlatformTransactionManager接口實現的,它是核心。當底層采用不同的持久化持術時,系統只需要使用該接口的不同實現類即可。
  • PlatformTransactionManager接口包含一個getTransaction(TransactionDefinition define)方法,該方法返回一個TransactionStatus對象,該對象就表示一個事務,它可簡單的控制和查詢事務。該事務可能是一個新的事務,也可能是已經存在的事務,如果當前執行線程已經處理事務管理下,則返回當前線程的事務,否則新建一個事務對象返回。它有如下方法:
    isNewTransaction():判斷是否是一個新事務
    setRollbackOnly():設置回滾
    isRollbackOnly():判斷是否有回滾標志
  • TransactionDefinition 接口用于定義事務規則,如隔離級別、超時、只讀狀態等等….
  • 2 Spring的兩種事務管理方式

    2.1 編程式配置事務

  • 編程式通過寫代碼的方式得到PlatformTransactionManager實例,然后設置開始事務、提交事務和回滾事務。
    2.2 聲明式配置事務
  • 聲明式配置不寫任何Java代碼,只需在XML文件中通過事務代理(AOP代理的一種)來配置。具體實現原理是,在目標方法執行前織入開始事務,在目標方法執行之后織入結束事務。推薦使用聲明式配置事務
  • spring用tx:命名空間的<tx:advice…/>元素來配置事務的增強處理,然后用<aop:advisor…/>元素啟用自動代理
    3.注意:
    spring支持接口代理,也支持對具體的類生成代理。
    如果一個具體的實現類如UserDaoImpl沒有實現接口,按如下配置沒有問題;但是,如果UserDaoImpl類實現了接口,則下面的配置將會報錯,要解決這個問題,需要在配置文件中設置proxy-target-class屬性的值為true,如下:
  • <aop:aspectj-autoproxy proxy-target-class="true"/>

    這是因為,Spring默認采用JDK動態代理,而CGLIB代理是面向接口代理的,二者區別需查閱相關資料。
    2.3 示例:
    對應配置文件:

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:util="http://www.springframework.org/schema/util"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsdhttp://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util-4.1.xsd"> <!-- 掃描springbean --><context:component-scan base-package="com.transaction" /><!-- 定義數據源Bean,使用C3P0數據源,并配置相關信息 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"destroy-method="close" p:driverClass="com.mysql.jdbc.Driver"p:jdbcUrl="jdbc:mysql://localhost:3306/db1"p:user="root"p:password="root"p:maxPoolSize="40"p:minPoolSize="2"p:initialPoolSize="2"p:maxIdleTime="30"/><!-- 配置JDBC數據源的局部事務管理器:使用DataSourceTransactionManager類該類實現了PlatformTransactionManager接口,是針對采用數據源連接的特定實現所以,也需要注入DataSource的引用 --><bean id="transactionManagerId" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource"/> <!-- 配置事務增強處理,指定事務管理器,transaction-manager屬性的默認值是:transactionManager --> <tx:advice id="txAdvice" transaction-manager="transactionManagerId"><!-- 配置詳細的事務 --><tx:attributes><!-- 所有以get開頭的方法只能讀 --><tx:method name="get*" read-only="true" /><!-- 其他方法設置默認隔離級別,超時為5秒 --><tx:method name="*" isolation="READ_COMMITTED"propagation="REQUIRED" timeout="5" /><!-- propagation屬性用于指定事務傳行為,它的值是枚舉值,具體每個值對應的行為是什么,請參考P687或百度 。isolation指定事務隔離級別rollback-for指定觸發事務回滾的異常類(須是全限定類名),多個異常類時用逗號隔開no-rollback-for 指定不觸發事務回滾的異常類--></tx:attributes></tx:advice><!-- 如果UserDaoImpl實現了接口,則必須加入以下代碼強制實現CGLIB動態代理,cglib可以在運行期擴展Java類與實現Java接口。cglib封裝了asm,可以在運行期動態生成新的class(默認是JDK動態代理),詳情可百度AOP的兩種代理方式 --><!-- <aop:aspectj-autoproxy proxy-target-class="true"/> --><!-- 配置AOP元素 --><aop:config><!-- 配置切入點:即AOP適用的范圍 --><aop:pointcut id="point" expression="execution(* com.transaction.UserDaoImpl.*(..))"/><!-- 在切入點 應用txAdvice增強處理--><aop:advisor advice-ref="txAdvice" pointcut-ref="point"/></aop:config></beans>

    對應Java邏輯代碼:

    @Repository("userDao") public class UserDaoImpl{@Resource(name="dataSource")private DataSource dataSource;//插入操作public void insertData(){JdbcTemplate jt = new JdbcTemplate(dataSource);jt.update("insert into workers_info values(id,workername) values(1,你好)"); }//讀取操作public void getData(){ JdbcTemplate jt = new JdbcTemplate(dataSource);jt.execute("select * from workers_info");//該方法在事務配置里設置為 只讀,執行下面的非讀操作會報錯//jt.update("insert into workers_info values(id,workername) values(1,你好)");} }

    spring還可以為不同的方法指定不同的事務策略,具體參見P691
    spring還允許將事務放在Java類中定義(@Transaction注解),具體參見P692

    3 spring事務的傳播屬性

    Spring補充知識

    ApplicationContextAware

    參考:https://www.jianshu.com/p/4c0723615a52

    注解@ControllerAdvice

    POJO:簡單的Java對象即JavaBean
    EJB:服務器端組件模型

    本人將知識都生成了圖片,地址:https://img-blog.csdn.net/20160930173240547

    總結

    以上是生活随笔為你收集整理的spring知识概要的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    久久视频网址 | 国产精品国内免费一区二区三区 | 日本在线h | 久久久久日本精品一区二区三区 | 国产精品小视频网站 | 中文字幕在线观看第二页 | 国产视频欧美视频 | 一区二区三区久久 | 欧美日韩大片在线观看 | 欧美日韩亚洲在线观看 | 久久好看 | 欧美日韩中文国产一区发布 | 国产一区二区日本 | 在线视频1卡二卡三卡 | 欧美一级小视频 | 97电影在线观看 | www.天堂av | 久久久成人精品 | 免费观看版 | 久久久综合色 | 久久国产亚洲视频 | 午夜精品久久久久久久99水蜜桃 | 中文字幕 在线看 | 成人国产精品一区二区 | av网在线观看 | 午夜少妇一区二区三区 | 在线观看韩日电影免费 | 国产精品麻豆欧美日韩ww | 伊人久在线 | 丝袜美女视频网站 | 黄色网址在线播放 | 在线观看日本韩国电影 | 成人免费观看在线视频 | 精品一区二区6 | 国产精品岛国久久久久久久久红粉 | 精品在线观看一区二区 | 91成人在线观看高潮 | 丝袜美腿在线视频 | 欧美色精品天天在线观看视频 | 欧美性成人 | 中文字幕在线看视频国产中文版 | 中文字幕在线免费观看 | 欧美一级乱黄 | 亚洲精品美女久久久久 | 亚洲精品网址在线观看 | www.香蕉视频在线观看 | 天堂av免费在线 | 99精品视频免费在线观看 | 国产亚洲精品久久久网站好莱 | 久久深夜 | 亚洲一区二区精品 | 美女网站在线免费观看 | 免费在线国产精品 | 97av超碰| 黄色av免费在线 | 欧美黑吊大战白妞欧美 | 99精品视频在线播放观看 | 欧美aa在线 | 91av在线电影| 久草精品视频 | 精品国偷自产国产一区 | 精品久久久久国产免费第一页 | 日韩免费在线视频 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 国产精品免费久久久久久久久久中文 | 久久精品99国产精品 | 美女视频黄,久久 | 日本久久久久久久久 | 色99在线| а天堂中文最新一区二区三区 | 国产精品美女久久久久久 | 麻豆久久一区二区 | av在线播放网址 | 国产精品毛片一区二区 | 特级黄色视频毛片 | 色噜噜在线观看视频 | 99福利片 | 久久免费精品视频 | 久久免费看视频 | 一区 二区 精品 | 色资源在线 | 亚洲精品美女在线观看 | 亚洲日本欧美在线 | 麻豆传媒一区二区 | 91亚洲精品久久久久图片蜜桃 | 亚洲国产三级在线观看 | 天天综合久久综合 | 热久久免费视频 | 亚洲精品婷婷 | 中文在线字幕免费观 | 欧美激情综合五月色丁香小说 | 一区二区三区影院 | 国产99久久99热这里精品5 | 国产91av视频在线观看 | 99精品国自产在线 | 国产精品男女啪啪 | 91超碰在线播放 | 日韩va亚洲va欧美va久久 | 国产精品久久久av久久久 | 香蕉日日 | 黄污视频网站大全 | 欧美一区二区伦理片 | 色插综合| 黄色影院在线免费观看 | 国产视频在线播放 | 色视频在线观看 | 亚洲精品成人免费 | 国产精品岛国久久久久久久久红粉 | 免费看污在线观看 | 黄色影院在线观看 | 欧美一级专区免费大片 | 亚洲第一香蕉视频 | 日本爱爱片 | 日韩免费av片 | 久久综合色播五月 | 久久网址 | wwwwwww黄| 91麻豆精品国产91久久久无需广告 | 最新av网址在线观看 | 日日狠狠 | 欧美性生活大片 | 丁香花中文在线免费观看 | 久久国产欧美日韩 | 国产精品99久久久久久久久 | 在线观看av国产 | 久久艹中文字幕 | 探花系列在线 | 国产中文字幕视频在线观看 | 久久不卡电影 | 亚洲精品在线国产 | 成人影视免费看 | 亚洲精品久久久蜜桃直播 | 午夜 久久 tv | 日本在线观看一区二区 | 在线亚洲成人 | 不卡的av电影在线观看 | 在线观看爱爱视频 | 国产精品一码二码三码在线 | 色综合夜色一区 | 久久综合在线 | 亚洲男模gay裸体gay | 亚洲区另类春色综合小说校园片 | 欧美午夜性生活 | 日韩黄在线观看 | 中文字幕在线观看资源 | 亚洲少妇激情 | 福利电影一区二区 | 亚洲人成免费网站 | 亚洲高清色综合 | 美女视频久久久 | 国产在线观看地址 | 欧美精品久久天天躁 | 国产高清av| 黄色三级免费观看 | 九九九九精品九九九九 | 激情网综合 | 天天操天天干天天爽 | 五月天婷婷狠狠 | 大荫蒂欧美视频另类xxxx | 日韩在线免费视频 | 麻豆高清免费国产一区 | 精品久久国产 | av久久久久久| 亚洲美女精品 | 波多野结衣久久资源 | 天天综合网入口 | 精品美女国产在线 | 亚洲精品动漫成人3d无尽在线 | 美女网站视频免费黄 | 免费视频99 | 在线视频你懂 | 91久久黄色 | 一区二区三区日韩视频在线观看 | 人人射人人 | 亚洲1区在线 | 色多多污污 | 久草在线这里只有精品 | 天天干天天操天天爱 | 日韩精品一区在线播放 | 国产人成精品一区二区三 | 最近中文字幕mv免费高清在线 | 久久天天躁狠狠躁夜夜不卡公司 | 亚洲成人频道 | 久艹视频在线免费观看 | 91av在线精品 | 国产短视频在线播放 | 日本久久中文 | 99精品久久99久久久久 | 在线你懂 | 国产主播99| 91视频啊啊啊 | 九九爱免费视频在线观看 | 天天操操操操操 | 国产99色 | 久久精品这里精品 | 精品亚洲免费 | 久久久久久久av | 狠狠狠狠干 | 四季av综合网站 | 久久久久久国产一区二区三区 | 日韩国产高清在线 | 久久久久看片 | 精品国产人成亚洲区 | 丁香视频全集免费观看 | 日韩字幕 | 亚洲精品免费在线观看 | 97国产超碰 | 国产色小视频 | 亚洲成av人片在线观看www | 午夜精品电影一区二区在线 | 色欧美日韩| 亚洲另类视频在线观看 | 中文字幕 欧美性 | 欧美性猛片, | 日日草夜夜操 | 狠狠躁夜夜躁人人爽超碰91 | 在线播放日韩av | av在线一 | 日日操天天操狠狠操 | 天天爽夜夜爽人人爽曰av | 国产精品女人久久久久久 | 丁香激情视频 | 日韩精品视频一二三 | 日本精品一区二区三区在线观看 | 99麻豆久久久国产精品免费 | 成人黄色视 | 97视频免费在线观看 | 国产一区av在线 | 免费av在线播放 | 久久午夜电影院 | 国产99黄| 91av原创 | 久久免费国产精品 | 98精品国产自产在线观看 | 欧美色道 | 国产一区在线免费观看视频 | 国产精品欧美一区二区 | 98久久 | 国产视频导航 | 日韩精品综合在线 | 日韩精品免费专区 | 97成人资源站| 在线午夜电影神马影院 | 成人av影院在线观看 | 久操免费视频 | av一级免费 | www成人av | 亚洲精品免费视频 | 黄色大片国产 | 欧美色图30p | 国产国产人免费人成免费视频 | 国产精品一区二区久久 | 日韩av中文字幕在线免费观看 | 亚洲美女精品视频 | 日韩av在线高清 | 日韩h在线观看 | 日韩91在线 | 九九热精品视频在线观看 | 国产黄在线看 | 波多野结衣久久资源 | 欧美日韩一区二区三区视频 | 51久久夜色精品国产麻豆 | 色a综合 | 免费精品| 国产成人av电影在线观看 | 欧美 日韩 久久 | av在线不卡观看 | 中文字幕日本在线观看 | 亚洲精品大片www | 91cn国产在线 | 国产精品久久久久av免费 | 中文字幕字幕中文 | 日韩一级片大全 | 69国产盗摄一区二区三区五区 | 国产美女精品视频 | 久久国产美女 | 成年人在线观看 | 亚洲精品视频在线观看视频 | 国产在线观看一 | 91精品国产福利在线观看 | 国产一级电影 | 国产精品手机看片 | 欧美日韩精品综合 | 超碰97久久 | 国产精品久久久久久久毛片 | 字幕网在线观看 | 国产精在线 | 三级av网| 欧美日韩国产一区二 | 色综合国产 | 日日干视频 | 麻豆av一区二区三区在线观看 | 精品国产色 | 91精品电影 | 日日夜夜噜噜噜 | 亚洲有 在线 | 九九久久免费 | www操操操 | 91c网站色版视频 | 亚洲三级视频 | 亚洲国产av精品毛片鲁大师 | 久久久国产在线视频 | av超碰免费在线 | 久久成人久久 | 手机在线观看国产精品 | 国产精品手机在线播放 | 欧洲视频一区 | 日韩在线视频看看 | 精品美女在线观看 | 久久免费a | 色婷婷福利视频 | 精品毛片一区二区免费看 | 特级西西444www大胆高清无视频 | 在线观看色视频 | 国产成人一区二区三区久久精品 | 91秒拍国产福利一区 | 日韩欧美视频免费看 | 91视频传媒| 美女视频a美女大全免费下载蜜臀 | 欧美人人爱 | 国产黄色片在线免费观看 | 9在线观看免费高清完整版在线观看明 | 在线免费国产视频 | 国产精品久久久久国产精品日日 | 国产一级做a爱片久久毛片a | 欧美精品一二三 | 久久精品精品 | av在线a| 在线看免费| 国产成人av网站 | 97干com| 射射射综合网 | 日韩精品免费在线 | 狠狠干狠狠艹 | 久久精品一区二区 | 日日夜色 | 97国产精品 | 在线看91| 欧美伦理一区 | 一级特黄aaa大片在线观看 | 最近久乱中文字幕 | 九草视频在线观看 | 97在线免费观看 | 美女福利视频在线 | 91人人人 | 色片网站在线观看 | 最近2019中文免费高清视频观看www99 | 97超碰免费在线观看 | 成人视屏免费看 | 精品国产1区二区 | 国产精品亚洲人在线观看 | 日韩av一区二区在线播放 | 高清国产一区 | 国内成人av| 久久久久日本精品一区二区三区 | 玖玖999| 一区二区精品视频 | 99热精品国产一区二区在线观看 | 99久久久久久久久 | 午夜美女wwww | 天天射天天色天天干 | 91精品久久久久久久久久入口 | 午夜久久福利视频 | 久久久久久久久久免费 | 黄色三级久久 | 国产成人黄色在线 | 国产在线播放不卡 | 国产高清在线免费 | 亚洲最大成人免费网站 | 中文字幕精品三区 | 日日干天天插 | 国产成人三级一区二区在线观看一 | 97碰视频 | 在线精品视频在线观看高清 | 国产偷在线 | 青青久草在线视频 | 99久热精品 | 色姑娘综合天天 | 在线观看视频99 | av一本久道久久波多野结衣 | 在线成人一区 | 99热国产在线中文 | 91精品人成在线观看 | 中文字幕在线观看第三页 | 狠狠躁天天躁 | 国产精品嫩草55av | 四虎永久免费在线观看 | 欧美日韩精品电影 | 久久久免费国产 | 91麻豆精品91久久久久同性 | 综合网婷婷 | 久草免费色站 | 天天噜天天色 | 国产精品久久久久久久久软件 | 亚洲精品视频播放 | 久久99久国产精品黄毛片入口 | 国产精品久久二区 | 国产精品国产三级国产不产一地 | 国产三级视频在线 | 成人福利在线播放 | 色婷婷精品大在线视频 | 日本在线中文在线 | 亚洲欧美激情插 | 久久综合久久88 | 午夜丰满寂寞少妇精品 | 国产精品美女久久 | 亚洲更新最快 | 97免费在线观看视频 | 久久久久久久久电影 | 美女网站视频免费黄 | 91视频传媒 | 久久国产片 | 欧美性性网| 中文字幕在线播放一区二区 | 精品在线一区二区三区 | 激情五月开心 | 久久人操 | 免费一级特黄毛大片 | 在线观看www91 | 欧美 高跟鞋交 xxxxhd | 超碰国产在线观看 | 日韩在线免费不卡 | 一本一本久久a久久精品综合妖精 | 欧美午夜激情网 | www四虎影院| 狠狠色狠狠综合久久 | 欧美日韩在线精品 | 精品毛片在线 | 91亚洲在线 | 深夜免费福利在线 | 色综合久久五月天 | 日韩专区 在线 | 97超碰.com| 国产精品久久久久久久久久久久午夜片 | 久久国产精品99国产精 | 五月色婷 | 精品国产自在精品国产精野外直播 | 久久人人看| 激情五月***国产精品 | 久久久久99精品成人片三人毛片 | 免费看污污视频的网站 | 欧美日本高清视频 | 三级黄免费看 | 五月天天色 | 欧美激情精品久久久久久免费 | 久久www免费人成看片高清 | 99久久婷婷国产综合精品 | 精产嫩模国品一二三区 | 久久精品香蕉 | 玖玖精品视频 | 中文字幕视频在线播放 | 免费日韩 精品中文字幕视频在线 | 日韩欧美一区二区在线 | 狠狠色狠狠色综合日日小说 | 日本在线观看一区二区 | 欧美成人tv | 国产精品久久久影视 | 网站在线观看你们懂的 | 久草在线手机视频 | 色噜噜在线观看 | 国产成人精品午夜在线播放 | 免费 在线 中文 日本 | 久久激情综合网 | 偷拍精偷拍精品欧洲亚洲网站 | 最新动作电影 | 国产精品久久 | 安徽妇搡bbbb搡bbbb | 麻豆91精品91久久久 | av一级免费 | a在线v| 免费亚洲精品视频 | 成人毛片一区二区三区 | 人人爱人人爽 | 激情在线免费视频 | 一区二区三区四区精品视频 | 国模精品一区二区三区 | 日韩精品一区二区三区水蜜桃 | 国产精品美女 | 91久久精| 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 亚洲最大激情中文字幕 | 一区二区三区免费在线观看视频 | 亚洲人成免费 | 婷婷丁香狠狠爱 | 一区二区三区四区免费视频 | 天天射天天干天天插 | www五月 | www免费黄色 | 97精品国产97久久久久久免费 | 久久亚洲精品电影 | 午夜精品一区二区三区免费视频 | 欧美福利久久 | 久久精品高清 | 国产精品一区二区三区免费看 | 国产成人61精品免费看片 | 99视频免费看 | 中文字幕电影高清在线观看 | 久久国产精品影片 | 国内毛片毛片 | 在线观看mv的中文字幕网站 | 99久久er热在这里只有精品15 | 激情九九 | 丁香资源影视免费观看 | 国产亚洲va综合人人澡精品 | 911久久香蕉国产线看观看 | 99久久综合国产精品二区 | 五月婷婷色播 | 五月婷婷在线播放 | 亚洲一区二区三区四区在线视频 | www久草 | 国产在线高清精品 | 久久精品久久国产 | 开心激情婷婷 | 国产精品免费观看网站 | 亚洲成aⅴ人片久久青草影院 | 中文字幕一区二区三区精华液 | 久久在线免费观看视频 | 精品无人国产偷自产在线 | 91资源在线免费观看 | 日本精品xxxx | 亚洲少妇激情 | 天天干 天天摸 天天操 | 天天综合网入口 | 狠色在线| 在线观看av黄色 | 亚洲国产无 | 在线亚洲日本 | 国产福利在线不卡 | 精品国产中文字幕 | 五月综合在线观看 | 国产精品理论片 | 欧美成人免费在线 | 婷婷视频在线观看 | 麻豆成人在线观看 | 黄色av一区二区三区 | 九七视频在线 | 久久精品视频4 | 色综合中文字幕 | 亚洲三区在线 | 亚洲精品国产综合99久久夜夜嗨 | 欧美色综合久久 | 69xxxx欧美 | 天天色视频 | 日本成人中文字幕在线观看 | 四虎国产| 激情九九 | 久久精品一区二区三区中文字幕 | 日韩欧美极品 | 九九九热精品免费视频观看 | 深爱五月网 | 日本精品久久久久 | 久久九九免费视频 | 中文字幕成人av | 亚洲婷婷在线视频 | 久久综合视频网 | 日本最大色倩网站www | 一区二区视频播放 | 91麻豆精品91久久久久同性 | 国产丝袜 | 日韩精品专区在线影院重磅 | 狠狠狠色丁香综合久久天下网 | 91视频在线免费下载 | 中文字幕亚洲欧美日韩 | 亚洲四虎影院 | 五月天婷婷在线播放 | 婷婷六月综合网 | 久久影院精品 | 911亚洲精品第一 | 免费看污片 | 亚洲九九九在线观看 | 欧美日韩中文国产一区发布 | 日韩av在线高清 | 天天干.com| 国产精品美女久久久久久2018 | 日本精品视频一区 | 正在播放 久久 | 国产亚洲一区二区在线观看 | 精品黄色在线观看 | 美州a亚洲一视本频v色道 | 天天操福利视频 | 国产福利av在线 | 99国产免费网址 | 麻豆91精品91久久久 | 91麻豆精品国产午夜天堂 | 成人污视频在线观看 | 婷婷av电影 | 色综合久久88色综合天天免费 | 一区二区三区免费 | 亚洲成人av电影 | 国产美女网站视频 | 中文字幕久久久精品 | 欧洲激情综合 | 中文字幕乱码亚洲精品一区 | 91视频91自拍| 免费网站污 | 国产精品久久99 | 黄色一及电影 | 丁香久久综合 | 亚洲最新av | 国产一级片一区二区三区 | 成人观看视频 | 91在线免费播放视频 | 2019中文最近的2019中文在线 | 亚洲成人二区 | 亚洲精品视频免费在线观看 | 天堂网一区二区三区 | 91成人免费看 | 精品日韩在线一区 | 成人av电影免费在线观看 | 免费黄色一区 | 狠狠狠色丁香婷婷综合久久88 | 99久久精品网 | 国产精品精品国产婷婷这里av | 麻豆传媒电影在线观看 | 日韩中文字幕视频在线 | 五月婷婷六月丁香激情 | 中文字字幕在线 | 国产精品大全 | 国产一级二级在线观看 | 狠狠色狠狠综合久久 | 欧美另类交在线观看 | 亚洲黄色网络 | 国产资源网 | 国产xvideos免费视频播放 | 天天干天天操av | 欧美小视频在线观看 | 精品国产一区二区在线 | 国产一级电影 | 蜜桃传媒一区二区 | 麻豆国产精品va在线观看不卡 | 中字幕视频在线永久在线观看免费 | 欧美日韩免费观看一区=区三区 | 日本爽妇网 | 成人一区影院 | 中文字幕亚洲欧美 | 天堂网一区二区三区 | 日本久久久亚洲精品 | 成人黄色中文字幕 | 天天射天天操天天 | 精品国产精品国产偷麻豆 | a级片韩国 | 日韩综合一区二区 | 九色视频网站 | 日韩在线视频观看 | 国产精品99久久久久久有的能看 | 人人干在线观看 | 国产一区二区免费在线观看 | 国产91精品高清一区二区三区 | 曰本三级在线 | 免费在线观看一级片 | 精品中文字幕在线播放 | 天堂视频中文在线 | 午夜手机看片 | 最新av在线网站 | 欧美日韩国产欧美 | 狠狠地操 | 婷婷丁香久久五月婷婷 | 久久久久久久久久久电影 | 992tv成人免费看片 | 亚洲专区一二三 | 国产精品com| 天天摸天天操天天舔 | 天天干天天操天天拍 | 99久久婷婷国产综合精品 | 久久精品国产久精国产 | 91精品国产九九九久久久亚洲 | 四虎成人精品永久免费av | 亚洲天堂网在线观看视频 | 久久精品久久精品久久39 | 免费看一级特黄a大片 | www.操.com| av资源免费观看 | 91精品国产成人www | 国产看片免费 | 一区二区三区免费在线 | 99久高清在线观看视频99精品热在线观看视频 | 亚洲视频2 | 国内精品久久久久久中文字幕 | 日韩欧美国产视频 | 免费午夜视频在线观看 | 午夜视频在线观看一区二区三区 | 久久九九影视网 | 特级毛片网| 欧美日韩不卡在线视频 | 日韩理论| 激情五月婷婷综合 | 亚洲精品午夜视频 | 中文字幕观看av | 亚洲精品xx | 97超碰成人 | 成人在线观看影院 | 日本黄色免费播放 | 特及黄色片| 色视频网页 | 999视频精品 | 国产91对白在线播 | 日韩国产欧美视频 | 九九九热精品 | 天天操网 | 999久久久久久久久6666 | 91豆麻精品91久久久久久 | 91精品对白一区国产伦 | 国产精品18久久久久久久久久久久 | 午夜天使| 91成人免费在线 | 日日干夜夜操视频 | 中文字幕在线视频一区二区 | 精品女同一区二区三区在线观看 | 国产精品自产拍在线观看中文 | 丁香视频全集免费观看 | 久久久久99精品成人片三人毛片 | 欧美日韩精品影院 | 狠狠的干狠狠的操 | 久99久在线视频 | 国产资源在线播放 | 国产一级免费在线 | 麻花豆传媒mv在线观看网站 | 欧美日韩在线视频免费 | 99色国产 | 日韩免费在线视频 | 久久久性| 毛片一级免费一级 | 91在线免费观看网站 | 中文字幕免费观看视频 | 久久久久久久久艹 | 久久久久国产精品www | 免费a v视频 | 国产精品mv | 久久综合久久久久88 | 国产明星视频三级a三级点| 国产69精品久久久久9999apgf | 欧美日韩精品电影 | 中字幕视频在线永久在线观看免费 | 色视频 在线 | 美女亚洲精品 | 国产无套一区二区三区久久 | 最新黄色av网址 | 国产精品私人影院 | 久久影视一区二区 | 97久久久免费福利网址 | 国产精品久久二区 | 亚洲精品影院在线观看 | 草樱av| 99久久99热这里只有精品 | 色婷婷欧美 | 欧美久久久久久久久久久久久 | 日日日操| 成人资源网| 98超碰在线观看 | 国产一区在线免费观看视频 | 丁香亚洲 | 成人福利av | 天天色 天天 | 国产欧美在线一区二区三区 | 在线一二区 | 色五月成人 | 人人添人人澡 | 午夜在线资源 | 99在线免费观看 | 欧美午夜性生活 | 中文字幕在线播放av | 日韩av午夜 | av在线等 | 国产精品久久久电影 | 日本丶国产丶欧美色综合 | 国精产品999国精产品岳 | 日韩成人在线一区二区 | 亚洲色视频| 99热 精品在线 | 午夜久久影视 | 亚洲午夜小视频 | 国产精品尤物 | 成人黄色免费在线观看 | 色婷婷福利视频 | 国产艹b视频| 精品久久亚洲 | 中文字幕在线播放日韩 | 亚洲日本va在线观看 | 免费看的视频 | 国产 日韩 欧美 中文 在线播放 | 91视频免费视频 | 日韩久久久久久 | 中文字幕 91 | 人人看黄色| 99精品在线视频观看 | 色偷偷97 | 麻豆91精品| 久久国产精品视频免费看 | 久久香蕉国产精品麻豆粉嫩av | 婷婷久久久| 国产精品永久在线观看 | 天天干天天看 | 国产成人亚洲在线观看 | 亚洲国产高清视频 | 精品视频久久 | 国产91精品看黄网站 | 精品uu| 久久玖| 午夜av日韩 | 少妇做爰k8经典 | 久久草在线免费 | 国产一级二级在线观看 | 日韩视频一二三区 | 天天操天天舔天天干 | 成人毛片久久 | 久久国产精品免费 | 九草在线视频 | 97视频在线观看网址 | 久久在视频 | 国产一级视频 | 免费亚洲电影 | 日韩欧美视频一区二区三区 | 久久综合久久综合久久 | 日韩v在线91成人自拍 | 国产在线观 | 国产高清免费 | 国产精品一区一区三区 | 99r在线精品 | 中文字幕国产精品一区二区 | 免费在线观看不卡av | 日韩欧美在线中文字幕 | 日韩精品在线观看av | 视频三区 | 五月婷婷.com | 亚洲日本va中文字幕 | 日韩欧美网址 | av一区二区在线观看中文字幕 | 91中文在线观看 | 天天操操操操操 | 亚州视频在线 | 91精品国产91p65 | 99九九99九九九视频精品 | 日韩一区二区久久 | 在线精品观看 | 日韩电影久久久 | 国产一区在线免费观看视频 | 国偷自产中文字幕亚洲手机在线 | 国产999视频 | 久久综合99 | 亚州成人av在线 | 国产成人免费av电影 | 波多野结衣视频一区二区 | 久久超级碰| 超碰97中文 | 四虎国产精品成人免费4hu | 天天操操操操操操 | 色资源网在线观看 | 日韩在线视频免费播放 | 国产一区精品在线 | 国内揄拍国产精品 | 最新真实国产在线视频 | 91视频 - x99av | 日韩激情第一页 | 国产精品久久久久aaaa九色 | zzijzzij日本成熟少妇 | 99情趣网视频 | 久章草在线| 国产精品字幕 | 亚洲欧美在线综合 | 国产在线观看一区 | 国际精品久久久 | 欧美日韩激情视频8区 | 奇米网在线观看 | 91精品爽啪蜜夜国产在线播放 | 午夜精品视频在线 | 国产一区二区手机在线观看 | 国产精品原创视频 | 黄色av三级在线 | 国产高清在线免费观看 | 亚洲欧美精品在线 | av黄网站 | 免费日韩三级 | 久久成人精品视频 | 免费高清在线视频一区· | 国产色网 | 欧美激情精品久久久久久 | av资源免费观看 | 国产手机视频在线观看 | 六月色婷婷 | 在线午夜av | www一起操 | 精品免费| 亚洲精品国产精品国自产观看浪潮 | 久久精品三级 | 99热精品久久 | 精品视频在线观看 | 久久精品视频免费观看 | 亚洲男模gay裸体gay | 日韩成人精品一区二区三区 | 97电影院在线观看 | 亚洲欧美在线视频免费 | 91av在线免费观看 | 黄污网站在线 | 亚洲最大激情中文字幕 | 日本二区三区在线 | 免费在线观看日韩欧美 | 日韩久久久久久久 | 国产精品久久久久久久久久久久午夜 | 国产一级不卡视频 | 欧美成年人在线观看 | 免费色视频网站 | 免费观看一区二区 | a级片韩国 | 久久精品久久精品久久精品 | 最近中文字幕大全中文字幕免费 | 欧美性猛片| 久久在线一区 | 欧美日韩视频在线播放 | 中文字幕久久精品亚洲乱码 | 国产中文视频 | 91成人精品一区在线播放 | 色片网站在线观看 | 在线亚洲成人 | 超碰97在线人人 | a久久久久| 中文字幕永久 | 日日爽夜夜操 | 欧美成人性战久久 | 日韩在线观看av | 中文字幕在线国产精品 | 国产精品久久综合 | 国产精品男女视频 | 美女在线免费观看视频 | 一区二区免费不卡在线 | 国产精品岛国久久久久久久久红粉 | 九九热免费精品视频 | 99在线热播精品免费99热 | 美女久久视频 | 久久黄色影视 | 久久精品国产一区二区三区 | 中文字幕制服丝袜av久久 | 日本久久中文字幕 | 日韩av手机在线观看 | 日日夜夜免费精品视频 | 国产一区视频导航 | 蜜臀av性久久久久av蜜臀妖精 | 四虎精品成人免费网站 | 日本久久视频 | 日本免费久久高清视频 | 国产精品免费在线播放 | 日本最新中文字幕 | 日韩中文字幕国产 | 国产亚洲婷婷 | 天天搞天天干天天色 | 免费av片在线 | 国产精品久久久久永久免费看 | 午夜av色| 在线中文字幕电影 | 亚洲动漫在线观看 | 中文av在线播放 | 精品视频不卡 | 国产精品日韩在线观看 | 欧美精品久久久久久 | 在线观看一区 | 亚洲精品自拍视频在线观看 | 在线观看亚洲专区 | 久久精品一二区 | 日本护士撒尿xxxx18 | 国产精品不卡在线观看 | 国产a国产a国产a | 欧美日韩在线免费观看 | 久热这里有精品 | 九九视频这里只有精品 | 亚洲欧美日韩一级 | 日韩免费成人 | 97在线超碰 | 精品久久电影 | 免费看的国产视频网站 | 精品自拍av| 国产女v资源在线观看 | 亚洲电影网站 | 中文字幕中文字幕在线中文字幕三区 | 91丨九色丨国产在线观看 | 国产精品久久久久久久久久妇女 | 国产系列在线观看 | 九九久久国产精品 | 97人人添人澡人人爽超碰动图 | 久久99久久99精品免观看软件 | 中文字幕在线字幕中文 | 免费看色视频 | 911亚洲精品第一 | 三级黄免费看 | 日韩欧美区 | 激情在线网 | 最近最新中文字幕 | 国产视频日本 | 成人国产电影在线观看 | 特级大胆西西4444www | 日韩sese | 伊人www22综合色 | 国产亚洲成av人片在线观看桃 | www.看片网站 | 欧美日高清视频 | 日韩理论片在线观看 | 顶级欧美色妇4khd | 青草草在线视频 | 亚洲精品99久久久久久 | 91av视频在线免费观看 |