Spring
% S4 C. H3 L7 _4 I- 是什么?$ z, m3 N0 i6 l$ Z% g: [. b: Q8 b
3 J5 |/ W3 u2 H
Spring是基于JEE的轻量级的应用框架
0 N( l3 J) m0 h n, `- 有什么?
, T4 n% I' Z$ y9 d- A9 ], O( Q1 _! D9 o& n% U8 o
* Q2 ?0 H. z% f' h! M3 E
每个包的功能: Spring MVC:spring 本身提供的web 框架 WEB:集成其他的web 应用的框架,或者说是对其他web应用框架的支持。如struts,webwork JEE :集成一系列的jee的技术(对JEE技术的支持) DAO:封装了JDBC;(对JDBC的支持) ORM:提供了对ORM工具的集成(支持) AOP :面向切面编成 CORE:spring的核心包,提供bean的工厂和IOC容器
. M: n) D! u4 \3 P9 c/ w- 能干什么?8 Y% B: T' \1 O2 ]2 t: B) i8 d2 ?
: Y7 b& Q1 \' k
把一系列的jee的技术有效的组合在一起形成以良好的系统
. l; I- Z; V( R8 ^- K. J7 I+ T$ T- 怎么用?4 D# g1 n4 j9 B, X1 }
" G) C/ X* d: M
- 搭建web工程,引入spring的jar包
4 C2 [ s% R+ Y" q - 在web.xml中添加如下配置/ |& n1 l0 h) b, P8 G6 K
0 _$ i3 X% d% `( D/ i: v5 @
2 ~. R1 B9 H9 K+ I- J. C! p; ^9 j7 S" T' M9 M! U
contextConfigLocation
8 l" C- I. A' i6 T' O classpath*:applicationContext*.xml
& |0 U9 S) L% ~ z) v6 ?$ r' Q 5 `7 | k5 k [, ^! M& v3 T
& L% O- S7 ?8 T struts2
. S- `( K9 C2 Y7 C1 H : K' q! z4 ], X5 Q i# r
org.apache.struts2.dispatcher.FilterDispatcher
6 |5 l; m1 Q& k& {
! K0 w5 Y! X8 y5 y. T + Y ?1 s8 ?, Q( c0 F1 D$ `8 v
2 i8 U% `% s4 o) A- Z7 M. p
struts2
`- t# h" |& K2 c6 u /*
6 {! {8 x" Z3 y% F2 O - q# ?* y Q; q
. V0 D) B6 p* Q3 B' N8 U8 X# z
. ]) n4 `+ }4 l4 ~- u' b* T8 C
org.springframework.web.context.ContextLoaderListener
+ [! Y- A( ]- y8 |( r; I * |3 o7 y6 r$ y( c; s' W w9 O
- 部署7 `4 C3 ~3 s' a2 `; O: p. T! k
( W' x6 Q. x2 E) a' e) D7 r- @/ T
' P/ |) ^0 h. ~+ }( q6 g
' f6 N* s5 [" |$ E! n$ P% H$ P! i7 o- y" ]2 b: ^1 }; n: {
- 容器和bean
2 E' L" Q9 \) Y2 w. ]9 y. n
Bean :是指受spring的ioc管理的对象称为bean 容器 :(与jee的容器类比) Jee :提供组件的运行环境和管理组件的生命周期(不能单独存在) Spring :提供bean的运行环境和管理bean的生命周期(可以单独存在) ; I8 i+ s; H0 Z. g2 |9 F
5 u) W. ~7 d- L+ H4 W8 j/ R3 |- DI依赖注入
5 y" I8 _& A, f2 T' \/ @
1. 应用程序依赖spring注入所需要的对象 IOC和DI是对同一种事情的不同描述 2.setter注入: 在配置文件中将接口的实现配置为bean在应用程序中注入bean 例如: 在配置文件中 # c8 _5 }$ e5 v* x
- ^) Y9 X/ g4 R. |3 E' L2 A
, D, _. T9 g- J: t% i
在应用程序中 Public DBDAO dao ; Public void setDao(DBDAO dao){ This.dao = dao; } 3.构造器注入 : a9 t! c' z8 E ]- l w9 D" U, C6 f: Q
4.ref 表示参照其它的bean 在参照的过程中一定要注意死循环 5.自动装配———–〉no 自动装配根据名字来匹配相应的bean 尽量不要去自动装配 6.lookup注入 7.singleton 1.单例模式是整个的jvm中只有一个实例 2.spring的singleton是指在spring的容器中只有一个实例 一个生命周期中只有一个实例 8.DI的优点: 1.程序被动等待,强化面向接口编成 2.切断了对象或组件之间的联系,使程序的结构更加松散,运行和维护更加简单 - O# o' ^/ ^5 X5 |0 E3 R) x8 g+ x2 |
- Aop面向切面编程
: v" h; {, m! i! Z- y% ?/ P
0 c5 G# q" f5 u2 {8 J4 g
1.AOP面向切面编程 一些较好的模式或者是示例—-范式. X( ~, ^8 o2 P9 S
切面:一个切面代表我们所关注的一系列的共同的功能点(模块之间的共同的功能点) 2.AOP的思想: 主动—->被动(追加功能)6 [$ S! t$ Y' p* Q
3.AOP 的概念% c1 D& L# u- B9 V: W/ B
1.切面 :我们所关注的功能点 2.连接点 :事件的触发点(方法的执行) 3.通知 :连接点触发时执行的动作(方法) 4.切入点 :一系列的连接点的集合 (连接点的模块化) 5.引入 :扩展的功能 6.目标对象 :包含连接点的对象 7.aop代理 :实现机制 8.织入 :把advice和目标对象连接起来 4.AOP的事件机制
! [/ y9 t* G; z. J" I 1.通过切面找出一系列共同的功能点 2.找到目标对象(在标准的spring 中 接口的实现类为target) 3.找到切入点 4.确定连接点 5.通知spring AOP,查询xml文件,通过代理找到advice。 6.由aop代理来实现动态织入
f6 N% n# s% x( x4 \0 i; J3 k, m# W' R8 \; a, h
( i' N! K' u6 P. F9 P [
9 s( g3 Z+ A; B: l2 E
1 F9 z! \5 d4 j8 d% l P
0 g! L$ q- w! I- E7 {
; P4 j* V* ^' |. g# q) O4 Z3 w5. AspectJ3 X. F2 ]7 o6 [# B9 {( c9 ^
5.1.在xml中配置比较烦琐
' v) f) [, t8 r+ W F( R* a- ^# I 所有的入口必须从一个代理(ProxyFactoryBean)开始
) r5 M9 A' {! I+ E' [, A
$ r8 t6 p/ K- R8 R
+ s- F; v4 ^$ W% D( ?- P* X
8 b' L. K; e: A; g0 L* s! C( s z, `8 z: }7 J2 W( [
# Q$ G/ Y; A) W( J0 o; B% |
, a: }, T) p. e, A$ Z6 I+ H 9 |1 \& [9 D" G) |. P+ |" z
. q/ i8 z7 Z5 {2 y) Lexpression=“execution(* com.javakc.aop.MyTarget.t*())”/>! b3 G; P4 L1 r
: X3 D7 ^& f7 ]. z6 {% L
& {& B- F- r$ }; B( x j
! A" x2 M# h- p % S. c# p) T6 d: |) x& w4 y0 t
' G5 l. _! L% ]# H! ` E% ~) l
5.3.使用注解的方法相对简单
: v. g$ e) {* l& Z' k* ^! Y @AspectJ的基本语法; q9 z% ^7 {: N( H. Q1 T3 t8 e
1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面+ \' l2 n+ \9 K! s
直接在类上定义@Aspect9 v/ u- \4 u: U+ v6 E; _! O5 h
2.@Pointcut声明切入点
' W; X/ j u" W' {2 ` 2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字5 k! d3 @( W! R/ t
2.2、可以使用匿名的pointcut
( e7 I, _) ~% h* U9 V! b 2.3、执行切点的几种方法
+ x1 `" x. ~* R5 w' A# u+ F8 M$ ? 2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法
3 [' _* E) r6 ^2 @ 2.3.2 within 指定到包,不能指定到类
4 q$ y+ c2 \" H0 r& y1 X% Z within(”com.javakc.spring..*”)* k8 V/ _1 u. a v' c2 q! C
2.3.3 this 指定到实现接口的所有的实现类
* [7 ]" v6 n. Q5 a) t/ z 2.3.4 target 指定具体的实现类 d6 t9 `- }' V% y
5.4.advice的五种类型的示例$ q* u0 P; D* B, T! S p; O
客户端必须从接口走才能得到监控,实现想要追加的功能4 v2 E: F" z- p3 q9 ]/ r
5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)
* b! a8 P; o* z/ X 追加的方法的参数名字一定要与retrning的名字相同: D0 B/ E$ F8 h* l% v4 T
在注解@AfterReturning中必须加上pointcut和returning两个参数! i( X. ]- W5 R% l0 J! n2 ^
pointcut指所要监控的目标对象的方法
6 D9 P2 o6 c: W* ^0 e; e9 _5 K 得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配
! Z7 F! c }+ h" {9 g1 l 完成追加的功能; ~3 N: `0 [0 H+ q, \* z% u
1 定义一个pointcut,通过方法名来作为pointcut的名称来引用2 T! L) y) }% x6 G1 N& [. `& g1 w( }
(1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)
7 W: ^- p; j2 V7 T4 N3 p (2).
( I! Z) p' R2 Z/ j- e6 L' I 2.直接引用匿名的pointcut6 R9 N9 j. }' i, S' y; Z" n. K
(1).@AfterReturning(“execution(! Z6 [" n; a' j5 V
* com.javakc.spring.schemaaop.Api.test4())”)' a. \* r% C0 D5 [9 A! @, @3 F
(2).@AfterReturning(pointcut=. B1 s% o" Z, V" u6 g
“com.javakc.spring.schemaaop.TestPointcut.t4() &&% G7 d2 g) ^6 |* g8 s I; J& B
args(str)”, returning=”retVal”)
2 N& z" w; v) z$ t( `) v8 I @AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)
* |5 ^. s. ~+ x9 K7 u7 _ public void testAfterReturning(String str,Object retVal){8 i5 F. C( h: F0 g# ]
System.out.println(“afterReturning1=>”+retVal+”=>”+str);$ }% Z, W, B X4 O1 l
}3 C- M4 f( }& M$ H5 p3 M
5.4.2.@Aronud
" H/ u7 U0 @! O# Z$ d; o 注解@Around环绕追加功能;
U2 z/ J* u' L$ k" {6 y 在执行目标对象的方法的前、后追加功能;
+ s4 R6 O# b0 {, r% c: x! [ 必须有参数;第一个参数的类型必须为ProceedingJoinPoint;) Q. k2 P% F" ], x2 F
通过ProceedingJoinPoint的实例的proceed来调用所监控的
. A6 b, h5 O4 L$ E# B 目标对象的方法
# ~7 a& F A8 b& [! V2 P% A 1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
8 N- v9 N( Q7 P7 E9 c! I" Z( r5 g (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
% P! R; u9 {3 L) I7 N (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()
9 [5 a( }4 }( h: J9 @. j8 R && args(str)”), D# Z8 m1 W* b$ o
2.直接引用匿名的pointcut. ^5 F5 U1 U9 M$ e5 X% a- Y3 O
(1).@Around(“execution(
" b* v( ]2 r! W, P * com.javakc.spring.schemaaop.Api.test1())”)6 p/ Y% _8 |4 [% T3 S
(2).@Around(“execution(
2 Q9 m4 g" _: m f; ^. d) k0 E * com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)6 z* [7 i2 c; o7 s$ U9 j, n( y
// @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)+ \2 C, P* N6 ^2 W: T
@Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)1 ]8 ^* q7 H: i5 W) b
public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{
; z- q q' [8 s4 D System.out.println(“around1==========before1pointcut==>”+str)% G* A& z- A1 s3 Y
Object obj = prj.proceed();
1 t; ~3 w- P* X1 f8 U' H- a System.out.println(“around1==========after1pointcut==>”+str);! V4 q: h( S0 S5 {) O
}# S j2 Y9 {0 w6 u: `4 R$ [
5.4.3.@Before* {3 `1 M3 _$ R4 \5 Z( G/ P3 g/ T& a
注解@Before在执行目标对象的方法前追加相应的功能
9 o2 d, G4 t$ p4 l( X 1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
) S2 h& s8 X4 B( b( ^5 q8 _ (1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)5 ?. O9 W8 x' W+ s8 h
(2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)7 C7 G/ ~9 e ?0 L, E
注意args后的名称与参数名相同
" C9 X( \* O( Z 2.直接引用匿名的pointcut7 h! S( Y" L3 |+ Q! F
(1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”)2 d; b. a) O0 Y
(2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
% c. C/ g* O V) u( p/ B' s 注意args后的名称与参数名相同
! H H5 T5 D) A+ Y4 |3 Z, X // @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”). `. G+ L8 p7 N3 n# k1 i; m
@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)8 I7 j5 H: `1 x/ v
public void testBeforeParam(String str){ Y3 \& m; }0 t4 w( V& p- D" n
System.out.println(“before1=param=>”+str);2 X' [, j* k' f- Y: p+ V' |2 S
}! _) ? R! v9 w! U3 x$ G2 U5 e
9 O6 {3 q0 C% E- S/ F5 @5 g
5.4.4.@After7 |3 T J$ Z" _. |, Q0 k
注解@After在执行目标对象的方法后追加相应的功能% ]$ G& J, r& K6 d6 t$ {0 F4 I
1 定义一个pointcut,通过方法名来作为pointcut的名称来引用& ]% `0 U5 e* ?, W/ V( i) I! `- Y
(1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
5 D/ A9 S* q5 j7 G! O 2.直接引用匿名的pointcut( T$ y. ?7 ]$ v# I+ z
(1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
" f3 z a4 t3 ~8 E9 h! P3 C% }7 c @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
U5 t* u9 O# T6 m5 h3 C public void testAfter(){( u2 r8 ]% I! O( @) @6 S( X$ T
System.out.println(“after1== >pointcut”);
) _) f& x* c7 w. E7 y }) n+ J0 l+ U9 {# I+ c( ?
5.4.5.@AfterThorwing& ]$ _) C+ s4 U6 V/ @
Z7 ^0 ]# V* ~# b, C" N! `
$ v! W9 T3 t9 f" d8 f% B& _* [+ P) k- 描述一下spring中BeanFactory和ApplicationContext的差别
5 S3 ^% W q, A+ C
: f: `5 H; ^# q1 b# K, D+ J1 c$ O: V9 \, J
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”); 7 u2 W8 T. X3 E3 n" K
- 谈谈spring对DAO的支持( u6 b x. u! Y
; }" G$ Z3 K, B9 V: Y
Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。 z0 _* ~: u4 n
简化 DAO 组件的开发。0 t& {. b: t( O {. l0 Y& x! f
Spring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。
. W/ C7 j: F% s& d6 b, ^; U IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。5 y, ?2 h1 w, y2 G. Q
面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。1 B0 o9 z( Z) X5 t8 `# B
方便的事务管理: Spring的声明式事务管理力度是方法级。' Q" y7 e/ \+ {+ s) B- W( D
异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。% A, c1 b! k" Z: h7 ~# l3 r2 \
" Z% M, c: B9 y. R( Q: ^2 e. d
. U9 o( g5 w6 p3 n; h- K- 谈谈spring对hibernate的支持
. ~; [- ^' z- O4 B9 W: Y' z/ Q% l8 x4 r
在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。
7 A6 W M4 X- p& S. e 一旦 Hibernate 处于 Spring 的管理下, Hibernate 所需要的基础资源,都由 Spring 提供注入。Hibernate 创建 SessionFactory 必需的 DataSource ,执行持久化必需的 Session 及持久层访问必需的事务控制等,这些原本必须通过代码控制的逻辑,都将由Spring 接管 ataSource, SessionFactory, TransactionManager等,都将作为 Spring 容器中的 bean。将这些bean 放在配置文件中管理。3 L* l4 _1 J- F7 W; ~
1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:, q! r0 l G5 p& `6 R
2 w* A! A7 p: s2 g9 [ class=“org.apache.commons.dbcp.BasicDataSource”>) b+ e( u, A; X
7 b9 }* \9 R2 w- K; X. P8 M oracle.jdbc.driver.OracleDriver: D/ u# i. i4 G* U* d' t' {
7 t7 ?( K8 x* H% W
5 Y8 r" U) _- @0 ^2 @ jdbc racle:thin localhost:1521 rcl
7 \4 U9 C/ P+ _: j# n 9 \9 T# `( ]: R3 ~, x
+ X7 Q( \7 k/ p. P! V" L7 f5 z
javakc2
( |5 ~( U3 p2 Y* d1 _' Y" w l7 r , n! X+ J% [1 D% U
6 P6 j$ |" S1 P; g4 `" m! l javakc2
9 T* o2 p9 p. p5 j( C
' z6 P" ~- f) B* _! U: D $ U$ A& W/ G) |8 e
9 |) F8 m6 [1 l6 I: Z class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>$ z3 z2 u) g% T
1 G, ]/ N" g; E# n$ b; J, E( U
3 m# x; t* I2 o2 Q. ? ( L$ G' i6 U# l. G
com/javakc/spring/h3/UserModel.hbm.xml$ A* U' W% i E* b
$ _$ u* m" Q) O
! U$ m8 Z+ r. W8 C
6 i; w6 \1 y1 |4 P( W! I
5 b8 E+ A! H4 y" h6 ^0 A5 H& w. O1 V3 [ hibernate.dialect=org.hibernate.dialect.OracleDialect
- F" _! T2 Z+ I3 y
, s$ A5 [- z+ `: R
$ s8 s( T4 \- ~4 S
: t! g2 t. W; [4 ]. G' f% X ; W- [" \) l' P& e i5 V5 ]
4 |+ e% n8 A4 W
' m. W7 j I5 w8 X$ N
如果需要使用容器管理的数据源,则无须提供数据驱动等信息,只需要提供数据源的JNDI 即可。对上文的SessionFactory只需将dataSource的配置替换成 JNDI 数据源,并将原有的 myDataSource Bean 替换成如下所示: class=“org.springframework.jndi.JndiObjectFactoryBean”>
9 Q# {' F0 N# ^. w& D9 M% x
4 b1 Q7 i# o, [9 E8 A) [: B java:comp/env/jdbc/myds6 H( a/ T; `6 u) i8 ?2 V, K/ v
7 L4 D1 U) C9 }( x 2、有效的 Session 管理: Dao类继承HibernateDaoSurport后,Spring 提供了 HibernateTemplate,用于持久层访问,该模板类无须显示打开 Session及关闭 Session。它只要获得 SessionFactory 的引用,将可以智能打开 Session,并在持久化访问结束后关闭 Session ,程序开发只需完成持久层逻辑,通用的操作则由HibernateTemplate 完成。 3、统一的事务管理。无论是编程式事务,还是声明式事务, Spring 都提供一致的编程模型,无须烦琐的开始事务、显式提交及回滚。 建议使用声明式事务管理,Spring 的声明式事务以 Spring 的 AOP 为基础。可将事务管理逻辑与代码分离。代码中无须实现任何事务逻辑,程序开发者可以更专注于业务逻辑的实现。声明式事务不与任何事务策略藕合,采用声明式事务可以方便地在全局事务和局部事务之间切换。 Spring声明性事务有两种配置方法,一种是xml配置: 2 a: t4 V/ j, o0 b% W
) r7 _1 s4 [* S ; x4 }/ S8 L" o6 u1 j
8 {0 `9 X7 O8 `' q
# i, }* L* @3 R5 A! [+ W# B& ?/ ^
3 D5 q4 p; y+ H; k+ g- N% p; |3 F' B
+ h3 i- ]% V! W& K6 @5 Q
+ w0 R4 j( x* a N) e t' q" H2 [
' N7 a* `: Y: x
2 }/ ]9 v4 z2 F" Y3 C- y y- H
3 a7 |9 X% x* n) F V( E 5 y; X: R# B3 }; ]
" y) a6 N5 c( Y6 I7 E/ Y3 y- s : H9 t8 e4 j* N
另一种是通过注解,在需要添加事务的类上注明 @Transactional 3 [- X1 K* x- d B" B8 u
Spring2.0之前事务的写法
1 ~& u0 I+ `! d; f
* f& ~! t. C2 N) @! d
4 L Z# C: M% ]% }# u class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”
$ H$ h1 \+ ?4 q5 e8 A0 R4 N8 c0 b! t! {, q5 z2 ^6 \( M
abstract=”true”>' X2 O5 w! H. O
; B* r# v! {3 |* Y# Z( V% M1 s
4 {. k6 ^; [7 f& ~0 U! c0 b
% i& F; \. ?; }0 T( V( f2 _
* M! U% W: m% T0 k0 Y8 h' F, w8 L PROPAGATION_REQUIRED,readOnly
8 ~; I9 [. Z/ F2 r8 W; P+ h
) G6 J$ t; ?* [1 o( I' g PROPAGATION_REQUIRED
D. w% S2 g- h( w, r3 O) [- F- l; z/ o
. V# S) D5 | b7 o$ [
5 b2 P; m3 I& V% f }% j( S2 g! ^7 r0 f, i( t' D9 v3 R
| & m# u- M- b- `7 }3 v+ U$ ~% N7 M
4 C' C+ A* _; }- 谈谈Spring对事务的支持8 k F/ b O) [9 q8 Q
1 R( V" u0 ?0 O9 B' v; M
' z* s% q- L" I* \$ h( I
1、声明式事务管理: 1.流程:由客户端访问—-aop监控—-调用advice来追加事务 2.做法: 2.1 在配置文件的头中引入xmlns:tx 和schema的文件 2.2 2.3 注入数据源
/ A7 V' G/ w+ k/ K& D- K; S) L0 ]1 e6 v5 [/ t
$ [9 @( g( n \: s( w- w. e
& k- ^8 c9 R5 [3 X1 y
- m% n3 u* e: s) F
- R) s- X) y O {
2.4 由spring实现的事务管理,但需要注入数据源
6 P9 ?/ k* Z+ |& I
. z: ^6 F: {" r$ z% k' N1 e4 k
; R: I8 Y8 F$ y/ ?% A* @2.5 事务监控所有的方法(事务加强) K# ?. v2 l" J' F0 K9 W9 r
9 l2 d$ r) Y9 ^8 K7 G+ i
1 {6 Q$ H: Q/ o3 s) z, f4 I; R* X. {: E, `1 U
7 H- ~: h: M' T
2.6 定义切入点
) e( B2 c1 R6 ?9 S8 t# q5 n/ r: C; u/ }
% |1 E+ Q+ S' B' W) w, F
. @' O/ h$ [5 ?% v9 i2 c
5 [+ _! a f3 k0 j; p0 @2、使用注解实现事务管理: 1.注解@Transcational (可以在类上,也可以在方法上) 2.在配置文件中同样需要注入dataSource和spring的事务管理 3.使用注解的方法来追加事务 注解驱动
0 g" u/ u0 ^& M7 v+ \$ z$ h, [, P- J7 P
如何在Spring中使用Hibernate的事务:
( m8 u6 C+ W K& O. L
& a" C) w$ g3 ] g
) e: A; `! x6 ~. R
: w0 |7 ^* k9 _* o+ g如何在Spring中使用JTA的事务:
( m+ L% [; F( f4 H
% ]; l. m4 g4 c. m8 S9 k' G, L |