Spring6 T1 x# t7 ?4 u G$ e4 Q
- 是什么?& _7 \4 q* Z3 j" ?* r
6 f9 e4 P6 S- x# g6 l
Spring是基于JEE的轻量级的应用框架 - v8 _( F6 x E
- 有什么?
0 m3 o n8 x1 U" _ D+ K% P
0 W' o5 v; u. G" ]0 k
+ H" k) @7 L- x
每个包的功能: Spring MVC:spring 本身提供的web 框架 WEB:集成其他的web 应用的框架,或者说是对其他web应用框架的支持。如struts,webwork JEE :集成一系列的jee的技术(对JEE技术的支持) DAO:封装了JDBC;(对JDBC的支持) ORM:提供了对ORM工具的集成(支持) AOP :面向切面编成 CORE:spring的核心包,提供bean的工厂和IOC容器 " D D/ f: n" i! q
- 能干什么?! h" w% @: I0 k; t" w# q. B
+ H2 b7 z" j# [* u$ z
把一系列的jee的技术有效的组合在一起形成以良好的系统 ' t, o0 W4 x4 F- O. Y8 B$ j
- 怎么用?2 C! x+ y" V" `! b9 }5 Y
4 T, V, ?: h2 O- 搭建web工程,引入spring的jar包
3 C, C) {6 G+ q, ~ - 在web.xml中添加如下配置0 J& ]2 H+ g+ U. K( i8 C
7 L+ _8 B4 ` C) |/ l1 n9 x. F4 p
- Q, ^& g$ E& }* c9 ?6 j/ s0 \
4 x0 L, u m! R7 z- f& L2 L
contextConfigLocation
9 {* l+ Y; e: U! V; Y0 U classpath*:applicationContext*.xml
# @/ \5 z; j; Z {$ W3 F, C2 W6 R
3 }+ U8 e- U4 k
- V' s& H- ?$ S; N3 R |5 R struts27 i: d8 s9 g3 `3 t9 U/ I: g3 ?
7 U. d& H* L& P% `6 c' N
org.apache.struts2.dispatcher.FilterDispatcher
5 }. h' U0 ?5 U+ ?
% C# z# D# `% c* S* k O6 V0 v7 g- c 5 s: Y: U0 x; n( ~
. C5 Y# P9 R/ ^& N8 X
struts2) ?4 c( B9 t6 L* U
/*+ w& g5 N9 ?3 l: i, R& G3 z. T& K
8 D* m& |1 N+ y# ^/ s% ^
2 p+ g9 O, n4 n9 Z8 o, B( d+ b
) m" S2 u3 E5 R; n
org.springframework.web.context.ContextLoaderListener
5 h% U2 ~4 p, ~6 f
. X$ | m7 |) e" H; l - 部署
: k. p3 K* K- K$ v- h
$ e+ \ a( L& q3 T6 t; r . I+ C! `* ~( g( q! p. o2 R( }
- J6 G6 o5 g9 |0 _8 L
& U# \ ?% y( v6 Q- 容器和bean2 k+ x6 c( o) d- o- b' }
Bean :是指受spring的ioc管理的对象称为bean 容器 :(与jee的容器类比) Jee :提供组件的运行环境和管理组件的生命周期(不能单独存在) Spring :提供bean的运行环境和管理bean的生命周期(可以单独存在) 3 H, w) j; ?6 [7 ^8 D0 L
# O7 S6 @7 W+ w6 {& w. m8 S' H- DI依赖注入( I5 E+ y" Y/ B* Z& x' f
1. 应用程序依赖spring注入所需要的对象 IOC和DI是对同一种事情的不同描述 2.setter注入: 在配置文件中将接口的实现配置为bean在应用程序中注入bean 例如: 在配置文件中
. a6 ?6 q5 ~ u3 }5 v
! c& t5 r' q1 M |. _* L3 y+ i# Y: w+ Y4 S) H
在应用程序中 Public DBDAO dao ; Public void setDao(DBDAO dao){ This.dao = dao; } 3.构造器注入 . Z. e- _, x' s) a
4.ref 表示参照其它的bean 在参照的过程中一定要注意死循环 5.自动装配———–〉no 自动装配根据名字来匹配相应的bean 尽量不要去自动装配 6.lookup注入 7.singleton 1.单例模式是整个的jvm中只有一个实例 2.spring的singleton是指在spring的容器中只有一个实例 一个生命周期中只有一个实例 8.DI的优点: 1.程序被动等待,强化面向接口编成 2.切断了对象或组件之间的联系,使程序的结构更加松散,运行和维护更加简单 2 B5 n4 `+ J: w7 f6 s
- Aop面向切面编程
- ~' K0 i, s7 r6 v1 |& J1 U. l" w5 g, |3 ?7 ^& x2 V' J
1.AOP面向切面编程 一些较好的模式或者是示例—-范式
% _* {$ k: Y4 z' e4 `( F 切面:一个切面代表我们所关注的一系列的共同的功能点(模块之间的共同的功能点) 2.AOP的思想: 主动—->被动(追加功能)
. W" Z9 C. t& S( T8 |+ W 3.AOP 的概念
: N4 a" H1 x0 k" h8 Q/ A6 e, j 1.切面 :我们所关注的功能点 2.连接点 :事件的触发点(方法的执行) 3.通知 :连接点触发时执行的动作(方法) 4.切入点 :一系列的连接点的集合 (连接点的模块化) 5.引入 :扩展的功能 6.目标对象 :包含连接点的对象 7.aop代理 :实现机制 8.织入 :把advice和目标对象连接起来 4.AOP的事件机制
1 g9 \, H4 o u: Z- |2 y 1.通过切面找出一系列共同的功能点 2.找到目标对象(在标准的spring 中 接口的实现类为target) 3.找到切入点 4.确定连接点 5.通知spring AOP,查询xml文件,通过代理找到advice。 6.由aop代理来实现动态织入
$ M* o: [: R" u) R; B
( S. G4 Z( E1 Q Y+ H$ |) J
0 R- A) D2 ]) I- I- k$ Q" Q* Y6 m( T; L! n
, f: U9 K7 h& _5 l$ G
% S4 x7 m3 E4 e
+ e; A4 i8 }1 T( }0 P5. AspectJ
: R$ h7 g! L! G3 W& J9 k 5.1.在xml中配置比较烦琐
8 R* ?! E; |/ r. U v 所有的入口必须从一个代理(ProxyFactoryBean)开始
+ s; \% ^: l8 O
/ F! p3 T* I h# M
2 j8 h. r, d9 @
) X9 E/ d7 Z6 y) ?8 J2 C' s5 L, D" s
" t V8 F: [6 S8 D
9 k( n X. v- G& l1 z7 @, j 2 Y! ?; g5 J N4 H; {" ?7 j
) s* T' Y+ d8 V4 f+ w* q/ Jexpression=“execution(* com.javakc.aop.MyTarget.t*())”/>
; @- q- K8 q6 ]0 B% ?% V/ I
3 u# ^2 u$ _6 y4 z
- q' q, P3 H6 d* H7 E2 O
) O6 d X% F! V, v) K$ \* ` . k7 U# {' B% I4 l% z0 o% G4 W
1 f6 \- J2 j- _/ v0 ^
5.3.使用注解的方法相对简单5 ?" I. L# C! V# l" W
@AspectJ的基本语法
% p3 |* ~. `3 ?0 Y) C+ o0 f 1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面
& h! L k; }, I H A' \: ~4 A 直接在类上定义@Aspect9 L! A. P; y9 W
2.@Pointcut声明切入点. f0 D* p; R# `. H: M3 t5 f
2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字
; ~0 {( _4 W. f2 S% R. D/ R# L 2.2、可以使用匿名的pointcut
7 D8 z7 W {' `2 I0 x- d5 [ 2.3、执行切点的几种方法" ]# k6 t6 K) \0 Q$ q7 i1 ~
2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法/ g S, S7 U- \$ Y# T; g% ^( h
2.3.2 within 指定到包,不能指定到类
- T0 q. n% O+ [4 [4 v4 L1 T8 @ within(”com.javakc.spring..*”)
# B$ `9 E0 v, e6 b7 |6 O" K 2.3.3 this 指定到实现接口的所有的实现类' y* L0 Q, D( ]
2.3.4 target 指定具体的实现类2 K- y5 F( S! [/ D3 }
5.4.advice的五种类型的示例( y& X X r2 d5 F) i* t
客户端必须从接口走才能得到监控,实现想要追加的功能
2 J* i. O k" h2 Z 5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)7 L+ M% w5 T5 w% r/ O
追加的方法的参数名字一定要与retrning的名字相同3 s: ]2 f3 `% f, M; s+ L5 \
在注解@AfterReturning中必须加上pointcut和returning两个参数
2 B; g# \, f. N& v2 U! k' M: n5 z pointcut指所要监控的目标对象的方法# Z1 d3 }, J. Z f% e
得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配
; ~, ^% b( z1 H, R, C0 I& f 完成追加的功能
" P X* \. i5 x7 |/ q 1 定义一个pointcut,通过方法名来作为pointcut的名称来引用: ]6 @9 {& J# D0 {
(1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)9 ]9 d. g* _! `2 c; l# l
(2).
! E2 j0 {; @2 w# D; Z2 q* r0 R 2.直接引用匿名的pointcut5 ?% D0 C/ F+ K
(1).@AfterReturning(“execution(& t3 K2 f$ v- H4 V. r
* com.javakc.spring.schemaaop.Api.test4())”)
, E4 o8 T w5 }) u" X0 q (2).@AfterReturning(pointcut=
" z% i4 P1 P3 U5 k5 K “com.javakc.spring.schemaaop.TestPointcut.t4() &&2 e( l! v m% j: S3 w
args(str)”, returning=”retVal”)5 v( {6 V+ Q# f; R% r8 F: k
@AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)
* Z& B0 g) @& h+ M public void testAfterReturning(String str,Object retVal){
4 H1 h4 q# n- J7 d2 M* k$ } System.out.println(“afterReturning1=>”+retVal+”=>”+str);: ?' G: D- I; X: l! C* x
}: _7 i9 M8 C8 X$ i* E
5.4.2.@Aronud# B, z) v& W9 \/ @4 G/ `, e/ ^: _( s% t
注解@Around环绕追加功能;! Y( I- J# K, r5 f% R/ \; [
在执行目标对象的方法的前、后追加功能;; b$ L6 |! o: Z2 f- d2 W0 [' A. G3 R
必须有参数;第一个参数的类型必须为ProceedingJoinPoint;7 h* ?% u* ?( n
通过ProceedingJoinPoint的实例的proceed来调用所监控的4 F$ U$ a& m# @ d
目标对象的方法" p& y$ Z) t( X# E, W, _% y" T' E6 j
1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
) o) v k+ l/ ^1 r (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
2 R2 R, M$ |+ f$ O8 C- k (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()
2 n+ O8 Q4 J4 F && args(str)”)+ \( _4 U# s6 p- A2 F
2.直接引用匿名的pointcut
$ P* B% i! O) f (1).@Around(“execution(, I4 r- o& t; d: h+ {- Q
* com.javakc.spring.schemaaop.Api.test1())”)
( q0 w4 {( T3 {4 [ (2).@Around(“execution(
+ ~4 R; a3 f& K2 E4 t- U * com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
9 z& L. s/ e! b7 {4 v // @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
% e5 {$ ?' I% A! i! M! R @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
3 j4 F5 @% x$ d; p public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{5 |2 x& @+ A' q
System.out.println(“around1==========before1pointcut==>”+str)8 M# _) m: s7 c6 r# b
Object obj = prj.proceed();1 b0 M8 u8 P' u! s7 c7 v+ K. d8 L' @: n
System.out.println(“around1==========after1pointcut==>”+str);! s; w8 o- K1 K
}' n5 @8 e8 ^& n- ^% E
5.4.3.@Before
4 `8 C9 o1 n& h 注解@Before在执行目标对象的方法前追加相应的功能
7 z4 a* R1 z O 1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
- ]3 T; i. Q6 V8 F3 c; e (1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
4 a- m4 k9 B' @ (2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)+ j) k4 P! @. o4 W
注意args后的名称与参数名相同5 U( P Y0 a3 W5 N
2.直接引用匿名的pointcut$ s, H! b3 I5 L* b" b0 T( H
(1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
0 `: }! x; k& g* Z (2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
6 D, f' Y' d, e( O n* B; [ 注意args后的名称与参数名相同
" H: v% F P# L# J // @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
: R b6 r& a) m. z) q6 Z4 z @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”): _, a" v* M7 I$ r+ ^3 q
public void testBeforeParam(String str){& a# t7 t# Z$ p" W
System.out.println(“before1=param=>”+str);- w2 K( {+ o, o0 H; B
}: V" N; j; T/ J2 j6 b/ r; o* o3 ?
9 b" S3 P2 U8 {) R: e
5.4.4.@After: u$ V2 f+ `5 ^4 W7 j
注解@After在执行目标对象的方法后追加相应的功能
! R- r O. t/ o. {% x0 \8 z 1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
- I: v+ N U' T/ Y1 A4 L& Q (1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)/ s, _$ o/ \ C% E' W9 H+ n
2.直接引用匿名的pointcut
, R. g! K; y. L y/ Q (1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
) n& \0 S. E I: h/ b @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)' O$ C4 z" J8 e' y1 _
public void testAfter(){4 [& b. F- c% ?$ V
System.out.println(“after1== >pointcut”);1 U, s# a A$ t
}
5 U- r0 ~% E8 r) d l- c7 e 5.4.5.@AfterThorwing( h$ o( k. e1 X7 B
; G. v& k# L7 `$ c
2 t6 x% }; G+ n3 V- 描述一下spring中BeanFactory和ApplicationContext的差别4 A/ J9 D8 L Q1 L) Y( r( u
* L/ ? L/ i1 y" r
BeanFactory是一个Interface,这是Spring的核心。它仅仅只是提供的一些基本功能。ApplicaionContext 也是一个interface,这是从BeanFactory继承过来的所以它具备了BeanFactory的所有功能。但它也从其它的类或interface得到了一些特性。比如提供国际化的消息访问,资源访问,事件传播。 但其主要区别在于BeanFactory是延迟加载,如果Bean的某一个属性没有注入,BeanFactory加载后,直至第一次使用getBean方法调用此Bean时才会抛出异常;而ApplicationContext则在初始化自身时检验,这样有利于检查所依赖属性是否注入;所以通常情况下我们选择使用ApplicationContext. 代码示例: BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource(“beans.xml”)); ApplicationContext cxt = new ClassPathXmlApplicationContext(“beans.xml”); ' n3 z, K$ W% f, [* f: d W) J8 f: O$ I
- 谈谈spring对DAO的支持
8 I5 `. j% |# E' L" e( `& s2 O1 `3 o( J+ p
Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。
9 `# X2 X+ D, l N* Z 简化 DAO 组件的开发。8 Y U2 k0 Z5 m1 U* }1 W
Spring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。2 B, Y4 |/ H3 v8 i1 V" u$ T
IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。* {' V8 M: K8 m B) Z8 B( h
面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。# j; S" y, H5 O. ^7 l+ y4 S3 Y
方便的事务管理: Spring的声明式事务管理力度是方法级。0 {9 A M/ u3 V; p/ T7 U) |
异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。. @* t+ C0 X0 `
u) h7 H& b k$ P6 ^
! O. _; a0 U; W/ Q* H- 谈谈spring对hibernate的支持9 v8 |5 Z# `, r7 e
: R+ ]2 \9 F$ x1 D: Z& v3 W* P
在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。* U9 z8 p! `% p9 L* C
一旦 Hibernate 处于 Spring 的管理下, Hibernate 所需要的基础资源,都由 Spring 提供注入。Hibernate 创建 SessionFactory 必需的 DataSource ,执行持久化必需的 Session 及持久层访问必需的事务控制等,这些原本必须通过代码控制的逻辑,都将由Spring 接管ataSource, SessionFactory, TransactionManager等,都将作为 Spring 容器中的 bean。将这些bean 放在配置文件中管理。
% E1 ?: c m8 j" m* P) M 1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:8 Z# r' C6 K$ [; ?7 U- |, F
, |) o+ A+ G" w# y) h3 R% d, J class=“org.apache.commons.dbcp.BasicDataSource”>
( i+ h. N0 B: J' f$ x : S# r1 P/ o3 e" C& f5 o* Y
oracle.jdbc.driver.OracleDriver
4 z4 i1 C" O' n3 L& l3 w4 G1 H. I \$ H7 @' h0 \6 i
) d" m# {5 \. O+ X5 O; n$ { jdbcracle:thinlocalhost:1521rcl! A' p) `/ G9 ^# I8 B4 W1 p- V- e5 |0 T
9 O& s$ }3 }7 N
5 }, Y; N, C- Y) T
javakc2
/ |. Z: n6 j. d 3 }, g3 R& |% d1 u1 Y& a' p8 j
: [, G% e0 P3 z3 M2 u4 c, o+ I
javakc2
+ n0 r% \3 l6 n& }7 x
4 M! W5 W/ R' @- P! o3 @1 f. a& P " C6 o4 _' L* R5 Y
' ~! v. X' ?+ g3 o
class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>
2 r- o! M5 N8 L) u: n4 J % E6 `0 N* b' ~( A
! B8 q: u+ m+ e+ a, F$ v
* s. B+ H8 m; w/ K: S8 N# U; x! Y com/javakc/spring/h3/UserModel.hbm.xml S' V$ o2 O8 i7 H6 y2 o
2 r( Y" g: E4 B0 H; U3 a
7 d9 p+ Q3 c+ n3 b
4 o, W% L7 y S( J * d) {, k9 [" _6 J+ z) o. f
hibernate.dialect=org.hibernate.dialect.OracleDialect
9 M9 ^: W4 W; |, ] 8 p. ]0 u, v% p" ]* I; T
* k1 @ r2 q1 `8 L, ?
. V* Y! S- |4 K) B5 m
/ j$ Z5 h* a9 I4 k2 p0 U; j
& s7 k" x, B1 R3 m, Y6 N5 I( H 0 |& ?7 f/ ~1 B+ ?
如果需要使用容器管理的数据源,则无须提供数据驱动等信息,只需要提供数据源的JNDI 即可。对上文的SessionFactory只需将dataSource的配置替换成 JNDI 数据源,并将原有的 myDataSource Bean 替换成如下所示: class=“org.springframework.jndi.JndiObjectFactoryBean”>. j4 k8 t% t+ V y* ~4 H
( D' P q6 f5 O# P4 _) j, V java:comp/env/jdbc/myds
) o: Q/ P( ?$ O4 }" l# S1 U
% E. ^0 | b6 F! K: y 2、有效的 Session 管理: Dao类继承HibernateDaoSurport后,Spring 提供了 HibernateTemplate,用于持久层访问,该模板类无须显示打开 Session及关闭 Session。它只要获得 SessionFactory 的引用,将可以智能打开 Session,并在持久化访问结束后关闭 Session ,程序开发只需完成持久层逻辑,通用的操作则由HibernateTemplate 完成。 3、统一的事务管理。无论是编程式事务,还是声明式事务, Spring 都提供一致的编程模型,无须烦琐的开始事务、显式提交及回滚。 建议使用声明式事务管理,Spring 的声明式事务以 Spring 的 AOP 为基础。可将事务管理逻辑与代码分离。代码中无须实现任何事务逻辑,程序开发者可以更专注于业务逻辑的实现。声明式事务不与任何事务策略藕合,采用声明式事务可以方便地在全局事务和局部事务之间切换。 Spring声明性事务有两种配置方法,一种是xml配置: # c. B3 m0 }+ b0 s: D3 k9 N
; ~0 q5 j# E5 S& L* ~3 }' y. u; [
( s- L" V: Z0 H6 d l & q% o" i- J" S9 z
( k# F: c6 w1 [% l& @' {' t
( [& z+ @8 T% @& r l% I; ~! n6 N
7 G. B1 [) h' P* m r7 D $ s9 G7 u" X# Q; I# Z
z' E2 _4 J' ]3 A( {
A9 N9 S- Y# C- d
0 |" e% T( \' \4 }6 f' D* i; R, G
, J8 F9 q. U4 N1 e" ?
E& J8 x+ a1 T4 f: X7 ?
5 x) E7 S8 ^- Y
另一种是通过注解,在需要添加事务的类上注明 @Transactional
) n3 b3 V) f1 E( L/ N; c/ Y5 c) OSpring2.0之前事务的写法
q8 V; a! T5 b! j Q8 l9 F
8 I* P. J7 v- @! ~5 d: k9 ]% @. ]) V- Y
class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”
" F. h0 q0 Q( Z- B& D L# S q* {# \7 w& M( h
abstract=”true”>. f+ Q4 p& a% C4 k, |
& V) B+ @$ ` v6 B& t# n/ q7 |. Q* D V
. S' `. ` Q* M, i: _
/ F9 d' B( d) _! T2 M/ G PROPAGATION_REQUIRED,readOnly1 m4 h1 q5 z; l
4 F9 t8 V5 `& j4 x8 l PROPAGATION_REQUIRED& k' \8 q9 T) \" H
) t1 z f( Q7 z* j
9 V% b3 K7 I; p# u, f ^. [/ ?
% T) n; c& L- E5 E, ?: a' x/ C# _1 E/ a; h5 r9 [. h$ p4 f
|
* l" B y$ v" ?0 Z' `
, K2 O# M+ B5 ]# U$ ?/ y4 x- s- 谈谈Spring对事务的支持: d1 A" H& k: S. X& N1 V
9 P0 [2 R# m% f4 a1 O/ m/ ^3 q
5 F* L$ v) ]4 h3 z1、声明式事务管理:
1.流程:由客户端访问—-aop监控—-调用advice来追加事务 2.做法: 2.1 在配置文件的头中引入xmlns:tx 和schema的文件 2.2 2.3 注入数据源
2 U* j7 L! c8 ]9 i: ~* R7 Q
. b: L m* i% ] ^2 u# b" @4 J$ s6 ?9 n: i1 e, m
8 {# w, v# e) F4 T+ D X, N
/ r3 g% p) B2 s! |7 Q
6 w9 f( e- z& n% j/ c2 \" @; }2.4 由spring实现的事务管理,但需要注入数据源
5 q7 j; R; D; T+ f) o
6 n: q; {8 ?/ V0 v3 _
! q; C& J! Z% Q4 Y& v) N2.5 事务监控所有的方法(事务加强) 5 \& p/ d6 w5 I
1 e# i( R8 L4 k5 H6 {4 c/ A# u# j
) ?, I& o8 [1 z+ o8 O
& P, K3 o4 K: S& N1 x+ s; O$ x( n
2.6 定义切入点 & d. ]. c4 n q A6 z. a `1 x8 b9 d
u: s9 C3 B4 [# d
1 H, R1 P% ]' m8 [4 } K
: N$ e# }5 `0 a! M2 R2 F1 s$ V7 K8 o5 a
2、使用注解实现事务管理: 1.注解@Transcational (可以在类上,也可以在方法上) 2.在配置文件中同样需要注入dataSource和spring的事务管理 3.使用注解的方法来追加事务 注解驱动
% j1 f3 O- b, E: \ V* Q9 N* E& D6 E! o! |5 T8 E+ _: Q
如何在Spring中使用Hibernate的事务:
* g! o7 x) H4 q+ E% B* C: v, q7 y3 l
& a g) m1 Y3 H h: _% D
" v4 h% n7 i* O; m {' l$ F . p7 c C. Z G& I5 b" c
如何在Spring中使用JTA的事务:0 N7 J! a% Z+ X {# F
" B5 c3 K0 ]. j. ] |