Spring, A7 q* q- d |) Y% [$ c! O
- 是什么?0 h9 z9 t; h! J& s" s w4 h
0 s' ?; g/ ]7 V: N; N
Spring是基于JEE的轻量级的应用框架
# y% S u2 y* F5 ] X1 J" c* x- 有什么?
% S+ Y1 F$ y( u9 z" Y1 c: Z& G8 U, r2 H! `+ C1 c+ ~, V5 y5 r# a
2 X" m/ \2 O+ O( o1 J* s! `+ A* M
每个包的功能: Spring MVC:spring 本身提供的web 框架 WEB:集成其他的web 应用的框架,或者说是对其他web应用框架的支持。如struts,webwork JEE :集成一系列的jee的技术(对JEE技术的支持) DAO:封装了JDBC;(对JDBC的支持) ORM:提供了对ORM工具的集成(支持) AOP :面向切面编成 CORE:spring的核心包,提供bean的工厂和IOC容器 $ k0 v1 f8 q8 z6 U+ P! v/ ?8 Q
- 能干什么?5 J& o- ~3 F2 O$ X, {$ d9 U7 z
- w6 {8 j2 A7 d/ D
把一系列的jee的技术有效的组合在一起形成以良好的系统
0 F- N. o& @- L8 o+ q: u* t& _* e2 q) @- 怎么用?
0 @: u, F/ p# X7 k1 K3 q
5 D/ l w* |! X: K- \6 E, P- 搭建web工程,引入spring的jar包* P1 l3 P1 o3 i" @; D4 j n1 K- F6 i
- 在web.xml中添加如下配置
0 h. a9 y: ]! r+ L) J, _* l" c2 U) p) ~1 n$ B+ l% n9 K* N
* I3 @. Q7 W, k% D/ h. w
, \9 } v+ C+ |$ Z3 T) m- s
contextConfigLocation' p/ @. d$ x5 X
classpath*:applicationContext*.xml
$ y' L% w$ a6 _: @ e2 d% m& C9 I2 Y+ ? 6 ?2 K5 y& R3 s# `1 g5 T# M7 M
; l% C( P+ a( y4 b1 Q7 H struts26 L t2 ~, [2 H% g
" Y2 Q% ]( i# @& k( g: U* t/ s2 i org.apache.struts2.dispatcher.FilterDispatcher
! Q6 O t5 X: B! t1 f8 T9 O' Z . h- Q& Z1 Y5 M4 f
2 ?+ W4 j1 T* [1 |
0 `; n! L m) _0 m
struts2
! b) j+ `$ n; n. a& {, [+ h& n /*
; e3 ]6 D+ E3 ?# P7 S3 X 0 [' V5 f( X, ]
) J1 _. o7 u4 f ]. c* p6 [
- q' {* Y3 r5 t. a e! w
org.springframework.web.context.ContextLoaderListener, L# F* a5 Z+ S
/ z3 U- l9 x% j9 i9 U. A4 _% f - 部署2 J# P" L K& @/ b) ~7 {1 T
2 q# K2 F+ z3 ?( M1 f( Y7 a2 F' o ; {& l+ Y. Z$ `2 G
. ?, v8 b# H2 e/ J0 C( v
+ k5 O9 T3 A' W- 容器和bean4 m" z) p5 B9 w% I
Bean :是指受spring的ioc管理的对象称为bean 容器 :(与jee的容器类比) Jee :提供组件的运行环境和管理组件的生命周期(不能单独存在) Spring :提供bean的运行环境和管理bean的生命周期(可以单独存在) 1 d) {9 C- i+ U
, k" ?$ h: Z3 C( b" t8 U/ \- DI依赖注入
' s/ {5 ?. P ]% q& t
1. 应用程序依赖spring注入所需要的对象 IOC和DI是对同一种事情的不同描述 2.setter注入: 在配置文件中将接口的实现配置为bean在应用程序中注入bean 例如: 在配置文件中
- y" b6 T% T( ~* o& ?! Y, h& d! N9 n* D! N6 S
0 y1 S% u7 Z9 q7 \
在应用程序中 Public DBDAO dao ; Public void setDao(DBDAO dao){ This.dao = dao; } 3.构造器注入 ; b& K4 c7 o, _ f# m
4.ref 表示参照其它的bean 在参照的过程中一定要注意死循环 5.自动装配———–〉no 自动装配根据名字来匹配相应的bean 尽量不要去自动装配 6.lookup注入 7.singleton 1.单例模式是整个的jvm中只有一个实例 2.spring的singleton是指在spring的容器中只有一个实例 一个生命周期中只有一个实例 8.DI的优点: 1.程序被动等待,强化面向接口编成 2.切断了对象或组件之间的联系,使程序的结构更加松散,运行和维护更加简单
2 u; `' I5 F5 V6 l- Aop面向切面编程7 I0 W" P8 v+ d8 n6 i
0 }: P% b6 j4 | _+ A. A
1.AOP面向切面编程 一些较好的模式或者是示例—-范式+ W z* G5 o8 V0 i2 q
切面:一个切面代表我们所关注的一系列的共同的功能点(模块之间的共同的功能点) 2.AOP的思想: 主动—->被动(追加功能)
. K& _0 J8 z9 u& n' | 3.AOP 的概念& S, G: C5 y& I; G8 e
1.切面 :我们所关注的功能点 2.连接点 :事件的触发点(方法的执行) 3.通知 :连接点触发时执行的动作(方法) 4.切入点 :一系列的连接点的集合 (连接点的模块化) 5.引入 :扩展的功能 6.目标对象 :包含连接点的对象 7.aop代理 :实现机制 8.织入 :把advice和目标对象连接起来 4.AOP的事件机制& \. q' d6 k; w
1.通过切面找出一系列共同的功能点 2.找到目标对象(在标准的spring 中 接口的实现类为target) 3.找到切入点 4.确定连接点 5.通知spring AOP,查询xml文件,通过代理找到advice。 6.由aop代理来实现动态织入 ! q; X1 d% J6 m# h% A
9 p3 b9 \3 [; r$ Q
5 V* p; t) @5 Z+ T2 d' _
' b1 U ~/ G6 k7 F
m8 l9 Y8 `8 y( w1 I. ^( C6 [9 a- w3 ~) i( l. ]/ L) B
) V, s) M/ T& V' R$ b; D( D
5. AspectJ
4 Z, R n; |$ {( E) p! d 5.1.在xml中配置比较烦琐
% t) g& C7 U1 d4 y' t* i7 f 所有的入口必须从一个代理(ProxyFactoryBean)开始! \% K* ~2 b; ?( t8 _: E
; R2 |" @7 \! t$ m" T0 ]3 V 5 K* }. N1 J% T9 I$ ^
5 [* U+ N( \8 b g( ^, Q
9 K# F+ u. ~2 \0 F: W
* y+ I4 E/ w. Z: L& j1 l) G * H6 o) ^+ M3 z" d. k% u" j
7 D! j k9 ]3 y; ]$ R( R* q* X$ Y 5 Z, o- B$ I" B4 v% ?* |
expression=“execution(* com.javakc.aop.MyTarget.t*())”/>; v* M- _7 w* e. P; }+ |
( g# [7 H* b7 r4 l* D9 A
+ p3 h6 v* `! f% A# D: p# e% U
* B8 t3 s! t/ H, ~" B& R# c
$ Z) v5 r, \- h/ n! Y, W# r5 ~ J+ T# l o+ F9 |1 w
5.3.使用注解的方法相对简单6 @( _( b0 t, O# _/ j$ Q
@AspectJ的基本语法
6 ]- [: x. s5 D% f/ @ 1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面
" y! o9 H0 P0 Z# \ 直接在类上定义@Aspect
5 V! z0 X- J: o0 ]1 _ 2.@Pointcut声明切入点
; |9 A2 n" J$ `' }' s: C 2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字
" ]% ?! I" c* n8 s8 A 2.2、可以使用匿名的pointcut
7 [. ^ P" Z8 E6 G; _9 `$ t, m6 \ 2.3、执行切点的几种方法0 n/ m3 X) Z' b' P8 s6 N& x
2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法; w4 X9 p% B4 {" t9 e6 D
2.3.2 within 指定到包,不能指定到类
9 G8 A6 }/ z; {" I6 n within(”com.javakc.spring..*”)
R5 w( b7 I: w( M 2.3.3 this 指定到实现接口的所有的实现类
2 v3 o5 Y, e% { 2.3.4 target 指定具体的实现类
$ {! z/ R7 b3 r; Y$ ] 5.4.advice的五种类型的示例5 q8 w' L9 l0 F# K
客户端必须从接口走才能得到监控,实现想要追加的功能: E( x2 A- t7 c
5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)
/ u9 Y0 B" x' g/ j6 g& V4 u 追加的方法的参数名字一定要与retrning的名字相同$ _! @7 G& z, o" y0 W7 Q
在注解@AfterReturning中必须加上pointcut和returning两个参数
: V U' w2 v1 Q$ K% C pointcut指所要监控的目标对象的方法9 b L- H! N. Q/ O
得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配
3 C. p5 W X# _% @ 完成追加的功能1 v0 J3 b" j1 o7 r4 c( Y& l
1 定义一个pointcut,通过方法名来作为pointcut的名称来引用# P5 y' I/ u& p- j+ ?
(1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)$ x0 O2 {. A( D7 a
(2).5 G5 \8 o; g( h4 n8 U7 M- \
2.直接引用匿名的pointcut' R1 ]( G: m+ A- b+ Q2 R3 h
(1).@AfterReturning(“execution(% p$ _2 e9 X* F4 g: X, ^" Y, X$ K
* com.javakc.spring.schemaaop.Api.test4())”)" n& n# `$ p2 X9 t* s1 \/ g. W- i
(2).@AfterReturning(pointcut=
0 L. e9 D1 Z' k+ m “com.javakc.spring.schemaaop.TestPointcut.t4() &&
2 Z( g8 M9 o! t+ [ args(str)”, returning=”retVal”)8 K- j5 u% n; P# l
@AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)
5 ?& ~9 U1 p# k; A; @) j public void testAfterReturning(String str,Object retVal){
8 |0 D1 s$ q8 L7 w9 L8 | System.out.println(“afterReturning1=>”+retVal+”=>”+str);
. V' o* @) a( ? }1 j0 O" t9 r) J) s k
5.4.2.@Aronud
7 C! w! G! |, L3 X, ]7 j9 P 注解@Around环绕追加功能;
' q+ T+ _1 u' g- `4 F 在执行目标对象的方法的前、后追加功能;1 d6 n$ [/ z& W5 o8 Y/ }
必须有参数;第一个参数的类型必须为ProceedingJoinPoint;
% [% _1 x. U0 b8 R: p- q7 | 通过ProceedingJoinPoint的实例的proceed来调用所监控的
* H1 H8 T3 V1 [! b" z4 D 目标对象的方法
* w+ ?# [# L I+ d% q 1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
3 V0 n) n8 e/ @3 A (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)* K6 \5 k* w2 G' f" n: Y6 p
(2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2(); C# j: M" J1 n
&& args(str)”)
' c6 A# n/ ~' V4 z7 T: j5 ] 2.直接引用匿名的pointcut
: T2 N7 q7 H' ?# S3 }8 I7 D (1).@Around(“execution(
/ q( l7 ~& Y# N- z; l * com.javakc.spring.schemaaop.Api.test1())”)
: p0 f: t7 S& X4 S (2).@Around(“execution() G1 w/ ^4 H9 D/ v& A( A
* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
8 U& v# c3 ]. [: u6 T0 g" \ // @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
7 m5 @+ j0 T" c2 {; r3 a9 I9 m @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)4 U! ]' t$ i/ U9 [
public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{+ m7 t) }: u/ F3 \9 P* `, H3 K1 P: e1 b
System.out.println(“around1==========before1pointcut==>”+str)
& C7 m3 v p4 d' o+ K' @3 W Object obj = prj.proceed();
( g. ~# t7 a$ K System.out.println(“around1==========after1pointcut==>”+str);1 b2 c: N J& Z1 R. `5 z A8 d0 K
}
6 f7 `2 h* k, j: b$ r 5.4.3.@Before/ D0 g% W/ T' {$ N: B1 c
注解@Before在执行目标对象的方法前追加相应的功能5 _( [# n+ C }* C
1 定义一个pointcut,通过方法名来作为pointcut的名称来引用0 m y/ `/ }' e0 {. r. _; m
(1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)1 A1 k" a p& D& ~% ?5 q
(2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)2 \+ a }, G" T
注意args后的名称与参数名相同6 F" V! `0 r6 v+ S3 _9 f
2.直接引用匿名的pointcut
1 ~! F0 _' `. r; H+ y r4 V (1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
" y& y; x! r4 n' N (2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
0 C. F [; |+ |1 v4 ] 注意args后的名称与参数名相同. M% v C" Y5 M; o# p3 K- c
// @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
; w8 T/ Y& O/ N& ]( y- d0 s$ U7 m @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
% Q! y# T* K- { `. D( K' C% h public void testBeforeParam(String str){% r9 z n$ _4 X% w" N9 y
System.out.println(“before1=param=>”+str);
$ b( m5 g4 B# | }! ^. v' V: m& ]
! d S4 y4 h# ]$ r0 u
5.4.4.@After2 g7 V- E3 k3 ?, Q- K
注解@After在执行目标对象的方法后追加相应的功能
& s4 i& L( e" B0 ]0 o+ N. a 1 定义一个pointcut,通过方法名来作为pointcut的名称来引用0 m; B' ~* ?& l6 [$ R# H& A( K, g$ |" I
(1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)7 m/ T5 V2 _8 Z1 v+ @6 \2 ]- g
2.直接引用匿名的pointcut- A3 S8 R% \" A5 g' G' ?+ Z
(1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
+ K5 Y! [& a5 T) I1 m0 s @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
. V2 m, A4 w- e public void testAfter(){" v" P9 E/ f: u) o1 s9 v/ ^
System.out.println(“after1== >pointcut”);- f! M- e' h7 q( m) t
}
4 p- i8 L8 P- r7 y8 J 5.4.5.@AfterThorwing
9 s% g9 q4 b$ T; }8 F; d 7 w) O. y" ]* f" W8 _# a
0 Z6 g8 f' a+ i: T) L- 描述一下spring中BeanFactory和ApplicationContext的差别, q7 Y: g$ I; [$ f+ E1 S: |, k6 c
. Z3 ~; X5 r* Z: u0 U6 j9 p
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”);
3 V* Q' w* v9 h; r+ [- 谈谈spring对DAO的支持
$ T) W& U: m' a' u3 ~ d2 t; J' s7 y B9 S" @; g
Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。
" \& ^* S( P/ P; h! V0 L( [ 简化 DAO 组件的开发。+ G b6 f% w7 d5 y3 c5 R* V" ~
Spring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。
6 y5 n1 l) o3 q, t, V) @8 h8 a7 b+ s IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。& a+ H$ Y/ U: ]' e! {
面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。% W8 B- p1 [ f& i0 U7 w& u9 y
方便的事务管理: Spring的声明式事务管理力度是方法级。8 T6 G. _; p& A( S4 F
异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。
) w6 A& x3 ^% E& z5 Z l
& a7 c# |+ E; ]% M i( B$ w
, b% D$ c: u5 w. H! \- 谈谈spring对hibernate的支持
. `: r* _2 s+ C6 h8 n( D
$ K, q, `- ~4 W
在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。. `( c* K) a- K
一旦 Hibernate 处于 Spring 的管理下, Hibernate 所需要的基础资源,都由 Spring 提供注入。Hibernate 创建 SessionFactory 必需的 DataSource ,执行持久化必需的 Session 及持久层访问必需的事务控制等,这些原本必须通过代码控制的逻辑,都将由Spring 接管ataSource, SessionFactory, TransactionManager等,都将作为 Spring 容器中的 bean。将这些bean 放在配置文件中管理。
1 l' X/ ^$ {/ Z& v: _; a 1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:5 v4 @8 [! Q+ _, P" f0 C# O$ u
$ o* H0 z; R. N3 m; q4 J
class=“org.apache.commons.dbcp.BasicDataSource”>/ }5 K) f+ I! l6 ~/ f9 p
9 R- k0 j0 j( F! t+ H2 Z* N
oracle.jdbc.driver.OracleDriver9 G' l' a) `% {
! A1 w, T$ V6 u+ d. Y
' u8 @: z! I4 C5 k: U, t9 G6 J0 {3 @ jdbcracle:thinlocalhost:1521rcl
; V4 q5 J* W* t3 R( N. g) b 9 ?4 _ a1 z- S
+ s c7 e- U& i4 c" i' A7 n7 k
javakc2
9 L6 G. N3 y1 `( T8 ` 3 \7 o3 Q" |8 C
7 y, q- |# {. _, ? javakc22 o6 r* r/ l! X# O
) P6 {+ s9 e8 D+ B5 @( K
. b3 i! l. n9 ]- \
; @ g/ r% w6 f: {# z3 l class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>
7 S' s5 H |" c) _! m- }/ z9 @
# N/ r1 O: j! m2 v0 Z5 p 5 G% I1 i/ I) m* _$ z7 Z
3 t8 q. {7 A! i; h' ^" _
com/javakc/spring/h3/UserModel.hbm.xml9 I, O2 ^- f1 S: T1 G
' R+ c2 n }( A + e9 a+ m/ G: G
! { H; E L0 }& \$ z
3 v3 k6 G- v3 ^% Y
hibernate.dialect=org.hibernate.dialect.OracleDialect
/ ]( K5 Z2 [% Q# @/ a: a E. X1 K( x- h. h+ h0 }- Z
/ Q7 {4 S3 g) i4 K. e+ N7 b
- Y1 ?5 J, ]4 _; d
1 _" D% W" @) o+ L
t2 ^* G& w* x( ?# x2 D 4 G* ]8 \/ d0 ?) T
如果需要使用容器管理的数据源,则无须提供数据驱动等信息,只需要提供数据源的JNDI 即可。对上文的SessionFactory只需将dataSource的配置替换成 JNDI 数据源,并将原有的 myDataSource Bean 替换成如下所示: class=“org.springframework.jndi.JndiObjectFactoryBean”>
8 B) v h! h) y- i ; _( N0 B) r3 w) H& }" l7 k' ~* ?
java:comp/env/jdbc/myds N2 [5 K# K" V) p& c# o
7 O2 Z6 A* u: l- a 2、有效的 Session 管理: Dao类继承HibernateDaoSurport后,Spring 提供了 HibernateTemplate,用于持久层访问,该模板类无须显示打开 Session及关闭 Session。它只要获得 SessionFactory 的引用,将可以智能打开 Session,并在持久化访问结束后关闭 Session ,程序开发只需完成持久层逻辑,通用的操作则由HibernateTemplate 完成。 3、统一的事务管理。无论是编程式事务,还是声明式事务, Spring 都提供一致的编程模型,无须烦琐的开始事务、显式提交及回滚。 建议使用声明式事务管理,Spring 的声明式事务以 Spring 的 AOP 为基础。可将事务管理逻辑与代码分离。代码中无须实现任何事务逻辑,程序开发者可以更专注于业务逻辑的实现。声明式事务不与任何事务策略藕合,采用声明式事务可以方便地在全局事务和局部事务之间切换。 Spring声明性事务有两种配置方法,一种是xml配置:
, o' O# N3 E! x/ C. N0 f5 o% W; X 7 J# d3 q( H# D+ t3 A
5 j- s7 m. n" f $ N8 W2 |( O+ F
; V' K9 d; r) {' V6 L# e
3 L" l( r7 O' V; k* Z" K
& ` A2 a( V3 f- l3 c# C
$ H1 U/ h. ^, s6 N4 z% L 4 `0 f4 r, @" `) W+ Q* _
9 ~; I0 P4 @( w+ `- c; I( a2 `
( F9 r: [: I U2 f
$ n' H4 [# D9 _, V
* n0 `0 Q& f; a5 b2 T
% A4 d) k) p j) E, L) H1 E 另一种是通过注解,在需要添加事务的类上注明 @Transactional
" x( @& _) f1 C M* RSpring2.0之前事务的写法
& \3 j$ w$ t2 G @0 W% n8 @
7 e! T' [& X8 Y4 U$ O3 Z, a i- m( g/ P7 B3 R: }
class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”7 c- D3 c' n" `. M# e7 r$ J u
0 ^% K, N1 t& r i6 k: \( w' Z. G! ~/ N abstract=”true”>
! f. a5 ^/ S! x" d, p3 |; u- S2 ^) Y8 X
, d0 x/ ]$ v$ v8 W; B7 O7 T }0 i! A) O p* Y P' P; i& f9 s
/ g; V- }% w; O
PROPAGATION_REQUIRED,readOnly% m4 `/ Z0 D# X1 w, a+ L3 {! v
3 l u0 \7 i9 R6 j# N% T
PROPAGATION_REQUIRED
: x, r- U* ^9 E9 f7 ?/ S# a8 W9 J
: F0 F3 t5 A) {" G8 u2 u9 o _( T3 A# J& F
) E0 R3 j3 m% D) ^* @# a; X) \" t
) X7 E5 h" M* l" v7 A5 A
| 6 r3 U1 ?& B, S" l2 p8 a: f3 L1 x1 p
! z, S! j8 b6 {# t; R- 谈谈Spring对事务的支持
) M/ O, M/ V. f% K* x! y. ~2 ^/ u p! R( `4 B9 s
, y1 m! q8 z: X4 X4 T4 b3 N" K
1、声明式事务管理: 1.流程:由客户端访问—-aop监控—-调用advice来追加事务 2.做法: 2.1 在配置文件的头中引入xmlns:tx 和schema的文件 2.2 2.3 注入数据源 ' W& j# q y N0 H- j
$ @* t# P. M5 E3 j/ {7 s5 C% k
$ c9 o3 ^2 S, i: Q4 K6 v
! Q" [$ ~3 T; y6 x( z- e/ v
# g, X) h" X& g* e5 k
8 j. d! E& p: }7 b9 T; j U, {# v2.4 由spring实现的事务管理,但需要注入数据源 ; x" G, h: o1 _, z! p) r+ M
0 t( T. z! u2 Z( `) d1 q# G% C; g5 V. J5 D3 F- d' I# ?
2.5 事务监控所有的方法(事务加强) ( Z0 r1 |" H% d' P
6 o8 }5 V0 C2 ^" W/ Y
2 ^4 S% y: y) a1 Q* l
6 e7 u9 O+ x# Q9 h/ h
" `, Y. U! K" l8 i2.6 定义切入点 ' \ @1 [0 u2 j P" C% C' L: n
( `9 Z9 Z& n' D! j; |7 X# \! V4 B2 W5 Q8 O, @8 Q" W; A$ v* I" g& H2 r
8 M! E, {# _+ Q. g3 W- S* _* M( K
; D& L3 i% }* D; H; w, N2、使用注解实现事务管理: 1.注解@Transcational (可以在类上,也可以在方法上) 2.在配置文件中同样需要注入dataSource和spring的事务管理 3.使用注解的方法来追加事务 注解驱动 ! \+ Y/ c8 p! o& F6 E+ J& x
0 E) u. W$ a7 v' h如何在Spring中使用Hibernate的事务:# P, r) `9 C( ^- q# o* P
b* _# u) R2 u
; k; S! o. Y+ A
( _, s1 S3 p8 |如何在Spring中使用JTA的事务:
6 R. q8 I4 C! q; }2 G( T5 c4 d3 B 8 y5 R4 M$ n; P* t
|