Spring
* A3 @1 X! m/ |* g& l( Y- 是什么?0 Y5 r4 {5 r5 z3 x& {" y0 Z! \8 n
6 \+ q! k" ~$ z: K6 y ?' r( j( m
Spring是基于JEE的轻量级的应用框架 . I) ~2 u/ c4 l: S
- 有什么?
" o. r7 N& `0 i, l- I J8 y. v$ Z5 Y6 l1 W9 s% f8 X" |/ i- K
2 z% m- z. k+ m& d3 r
每个包的功能: Spring MVC:spring 本身提供的web 框架 WEB:集成其他的web 应用的框架,或者说是对其他web应用框架的支持。如struts,webwork JEE :集成一系列的jee的技术(对JEE技术的支持) DAO:封装了JDBC;(对JDBC的支持) ORM:提供了对ORM工具的集成(支持) AOP :面向切面编成 CORE:spring的核心包,提供bean的工厂和IOC容器
7 L& {, `. ? A( E5 H- 能干什么?
' E) M; y2 E' \9 _3 K$ [
7 H$ K; i4 k( |& A+ ]% t3 M5 N" \
把一系列的jee的技术有效的组合在一起形成以良好的系统
# }7 T7 u/ N' I9 x; q& R, }- 怎么用?& i" \2 L# \: \" I5 h+ X
4 z3 g6 e/ @' D* E% J! V0 B6 ^
- 搭建web工程,引入spring的jar包' c+ C9 [6 D. y
- 在web.xml中添加如下配置
% ?% r. N! [0 K: Z/ s! w! G) V; p8 C) E9 ]2 ?/ p
6 B* e2 a: V& }4 k* j- Y
7 @4 b, U) b# X, W4 O
contextConfigLocation3 d8 ~6 l5 p. N$ t7 K
classpath*:applicationContext*.xml- h( {/ i/ Q# _8 t
* N. e2 s$ v2 `5 c 0 n8 f/ y; @+ k" l+ W
struts2
" W& }9 T; N9 T% b2 ^% J
2 y+ D7 G( U4 O/ [: h- C org.apache.struts2.dispatcher.FilterDispatcher
" e$ I! E2 c/ H% ]( m& R ! a1 `1 ~4 f8 F+ A( p
, M# E5 o/ s+ r$ d
3 r+ ^8 f! @% v) X! H. y
struts24 E3 o. k; y7 J2 l% ?! i5 I% r$ @$ M
/*
9 B: c, Y- \( w- T9 T% \
$ ]. B+ O ^% V
/ M* e4 ` b# [& J& X3 Y* m. h
( D- b+ p( y) L b: ^1 a
org.springframework.web.context.ContextLoaderListener( Z6 j% H* h ]( O* W2 e
" O. u" {6 r' o6 e1 F; \1 g - 部署
1 X6 T5 O" s0 q9 o! X3 Q: W, R$ C& R( d) X2 G+ y" i2 F
- [4 }4 Q: {- f5 C2 P+ {* w
+ o* u. g3 [) X8 z* N/ l( W
: s. w( P9 o2 M4 L4 E6 e ~
Bean :是指受spring的ioc管理的对象称为bean 容器 :(与jee的容器类比) Jee :提供组件的运行环境和管理组件的生命周期(不能单独存在) Spring :提供bean的运行环境和管理bean的生命周期(可以单独存在)
; X2 L' \3 F3 S" f# |4 \$ b! p: T) [! V" I! a# A/ I: X
- DI依赖注入
% p+ k# p5 L9 c0 R4 E
1. 应用程序依赖spring注入所需要的对象 IOC和DI是对同一种事情的不同描述 2.setter注入: 在配置文件中将接口的实现配置为bean在应用程序中注入bean 例如: 在配置文件中
" h$ t3 v: {9 o" H, @% ]5 C0 b5 j# I# ?( L* E9 a- A( V
1 t+ A( Y" K5 [! Z* c9 ^! q' }4 N在应用程序中 Public DBDAO dao ; Public void setDao(DBDAO dao){ This.dao = dao; } 3.构造器注入
" U t' i! @$ y+ p8 T# L* _. G/ z$ E4.ref 表示参照其它的bean 在参照的过程中一定要注意死循环 5.自动装配———–〉no 自动装配根据名字来匹配相应的bean 尽量不要去自动装配 6.lookup注入 7.singleton 1.单例模式是整个的jvm中只有一个实例 2.spring的singleton是指在spring的容器中只有一个实例 一个生命周期中只有一个实例 8.DI的优点: 1.程序被动等待,强化面向接口编成 2.切断了对象或组件之间的联系,使程序的结构更加松散,运行和维护更加简单 m) m$ s3 _( P% \% i1 t
- Aop面向切面编程; {( G7 z4 i$ r: s# f( R" N/ z
4 U! G; M" r# U. P- F+ H
1.AOP面向切面编程 一些较好的模式或者是示例—-范式$ v9 ` V' m3 p; c+ V4 V
切面:一个切面代表我们所关注的一系列的共同的功能点(模块之间的共同的功能点) 2.AOP的思想: 主动—->被动(追加功能): @7 `7 D! [9 o/ b& p' q2 F
3.AOP 的概念9 [$ E% ?( o( m5 y4 p
1.切面 :我们所关注的功能点 2.连接点 :事件的触发点(方法的执行) 3.通知 :连接点触发时执行的动作(方法) 4.切入点 :一系列的连接点的集合 (连接点的模块化) 5.引入 :扩展的功能 6.目标对象 :包含连接点的对象 7.aop代理 :实现机制 8.织入 :把advice和目标对象连接起来 4.AOP的事件机制
T6 X7 o) p& t. r ] 1.通过切面找出一系列共同的功能点 2.找到目标对象(在标准的spring 中 接口的实现类为target) 3.找到切入点 4.确定连接点 5.通知spring AOP,查询xml文件,通过代理找到advice。 6.由aop代理来实现动态织入
$ W+ \) w7 O. X4 U, K0 J8 q' y0 k8 U3 A9 {+ _
/ P7 v' ^- n3 i$ ]
8 _* I7 U* y) A& x. m* ~" h, {& p7 r7 g( [0 K) ? T; z2 q" x1 a
2 j) ]2 A) x/ _
0 P$ Q8 A4 v- E$ D+ q1 F. p! t$ w9 x5. AspectJ
- J5 x! b+ y% p' X' d8 u: s/ `1 c/ [. E 5.1.在xml中配置比较烦琐2 v2 D5 m2 g7 N6 Z9 p
所有的入口必须从一个代理(ProxyFactoryBean)开始1 A2 I# Z: S- r7 o
. P, d; Z5 ~' j( G/ P
; E! @9 x- R: D( {! i# s
8 ^% I& P: q7 P' H% q( M! \
2 q% w; @1 ~7 @, T q0 T# j9 I
; t' J" q0 x5 G, }7 U" A
a: ]+ }) d$ t9 i7 d 4 q! H3 B6 y5 a
# g$ f* L( s$ w/ d1 s8 ]$ Yexpression=“execution(* com.javakc.aop.MyTarget.t*())”/>" N1 \7 d' l9 l) K0 D, c
5 A# L, Z# U6 x' r7 `
" y' x# @" h. w 2 g9 b+ t4 m: X) `+ H0 m4 j
# X1 d7 r$ J9 {) h
3 P4 T- p3 {, u" F
5.3.使用注解的方法相对简单
" `2 f* e1 ~4 L9 F @AspectJ的基本语法
. f4 ?5 q# w$ I 1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面
8 t; o3 e) J- p4 y/ { 直接在类上定义@Aspect
3 H/ J' a6 g( p8 h1 c2 ^ 2.@Pointcut声明切入点
' n, E8 {$ N/ k( s0 O) Y. @2 N( T 2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字
" @) o- b. K8 u; W; z& j% U 2.2、可以使用匿名的pointcut- J' g; `& ^3 z8 S( J T
2.3、执行切点的几种方法
3 [' g/ J, w. _2 d8 |* V+ L 2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法8 m) k) W8 ?, b4 Q5 n
2.3.2 within 指定到包,不能指定到类9 g% m; z7 o4 ?, W
within(”com.javakc.spring..*”)! A0 o m8 I" @
2.3.3 this 指定到实现接口的所有的实现类
: P' w& r: j9 Y- ?# j 2.3.4 target 指定具体的实现类! e, `9 O& V" W F" c* ~% p2 T
5.4.advice的五种类型的示例
, t6 E' B& H$ D& i7 ]# S 客户端必须从接口走才能得到监控,实现想要追加的功能
6 N( _, Q% F+ ~" E 5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)
9 K+ N7 r, E; W/ W4 j 追加的方法的参数名字一定要与retrning的名字相同7 G# p2 `( q# ~/ K6 T# ]) X( C( O* y2 j
在注解@AfterReturning中必须加上pointcut和returning两个参数& d1 E% p* d$ b9 ?; }
pointcut指所要监控的目标对象的方法# Q6 Q$ i+ Z& |# F: H
得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配7 I# b+ C! G; q w2 n
完成追加的功能% q5 k$ F0 e3 E2 G# Y6 i
1 定义一个pointcut,通过方法名来作为pointcut的名称来引用. j9 X: t- R9 P* C/ _; H4 q
(1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)5 v3 S( E7 V* z2 l. B
(2). q( z0 z7 j' ], L ?/ w
2.直接引用匿名的pointcut
. N+ O" V! S) F$ F* U, p (1).@AfterReturning(“execution(
) D/ j1 U7 Q5 }- w" g7 L1 U * com.javakc.spring.schemaaop.Api.test4())”)
C. h% }* H) S( H4 P" y (2).@AfterReturning(pointcut=. D! ^: N$ `, e6 ~4 x3 m
“com.javakc.spring.schemaaop.TestPointcut.t4() &&' v% f4 G6 N5 v+ Q/ i( Y& ^
args(str)”, returning=”retVal”)( k* L# ^. V3 Q! L$ h# b
@AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)" g& k: ~9 p) V) Q4 g
public void testAfterReturning(String str,Object retVal){
& H- v# v# |% @7 F# q o System.out.println(“afterReturning1=>”+retVal+”=>”+str);: q3 P' ~& F' Z& u: L+ D N5 ~; s
}
9 K5 }$ v% n/ s1 U0 L; Q 5.4.2.@Aronud+ s3 J/ W( }9 l1 ?0 n" |
注解@Around环绕追加功能;% ]1 r- R( J. g0 l6 n
在执行目标对象的方法的前、后追加功能;, ]& h8 }3 S' N8 G& o
必须有参数;第一个参数的类型必须为ProceedingJoinPoint;
6 \5 [4 z$ k' I i 通过ProceedingJoinPoint的实例的proceed来调用所监控的0 w u- l: O; [: w# G; n
目标对象的方法+ E/ m# n) a _, S6 {
1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
; x; w: G/ J0 ]# ] (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
0 z1 l" B) g4 t. Z& u4 W (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()! r7 h" z+ l: d! v! H X, i( [
&& args(str)”)3 ^# A; C5 r. E2 D7 n7 n" m: j
2.直接引用匿名的pointcut- H0 W8 b- |1 \1 u7 Q+ h9 K1 K" g
(1).@Around(“execution(
5 u" K2 P6 Z3 O5 d6 ^ r * com.javakc.spring.schemaaop.Api.test1())”)5 F1 J; x: A- @: O
(2).@Around(“execution(5 t: J9 N n l8 }; X
* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)9 H! g: |( x# D- Q/ q# k% h
// @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
* {7 s( O- _8 j/ {1 s. e2 e# s a5 a @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)6 L/ b4 @ n# n" U3 _$ l% _1 j9 q
public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{
6 F1 U; v8 z K1 O$ o System.out.println(“around1==========before1pointcut==>”+str)
$ m3 C6 }7 q: N5 |/ ~% N, S Object obj = prj.proceed();/ T6 P; {( Q9 f/ _+ }( V
System.out.println(“around1==========after1pointcut==>”+str);
/ y( K$ x, s0 i: _9 K0 O& U! U }
- |6 Y3 C4 D" X 5.4.3.@Before% S% Z) a4 o$ U3 s6 S2 h" A- V1 ]
注解@Before在执行目标对象的方法前追加相应的功能% ?$ M1 b4 \& B' U5 o1 g
1 定义一个pointcut,通过方法名来作为pointcut的名称来引用( A! L: w5 q, N: K: u
(1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
. }: I! v. ~! X' ] (2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)! M2 w7 y+ j) B9 `/ }, V, W
注意args后的名称与参数名相同; E) K7 @" g5 a6 P& R" M2 _* c3 b7 G
2.直接引用匿名的pointcut
j5 F- N B* |5 m P (1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”): @: W3 O' a) `5 r
(2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
/ c6 f0 x4 {+ A3 U# J8 u+ b 注意args后的名称与参数名相同# M! y# Z$ D0 a5 S0 u; \" T
// @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
$ P9 `0 C9 J) h @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)1 A& P; \0 x8 ]+ u) g
public void testBeforeParam(String str){
' p3 J1 A) I. ?6 a/ K3 f System.out.println(“before1=param=>”+str);
+ ], F% v, L) m; U" M% u }' f$ L+ }% l: \, x: Q" {
: ~7 l2 ]1 z4 A5 m; Y* w7 [
5.4.4.@After0 e8 J) ?5 B l& L
注解@After在执行目标对象的方法后追加相应的功能
* \9 n3 v# _) u+ }, G) m l! ^ 1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
# B& b; Q! M `3 @) K/ o1 R$ T (1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”); |: c" Y% A* K' Z
2.直接引用匿名的pointcut
* _9 ?9 w8 b6 X0 |9 X$ Z (1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
1 I) ~& W6 |% W( u0 s+ Y @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)9 Z" U, _0 y/ n; C" c7 @
public void testAfter(){+ z+ [$ V. `. B: u
System.out.println(“after1== >pointcut”);1 Q* @7 h! K: t! K- g3 m5 e* w
} c% `& a. k$ r( c9 n" H% b
5.4.5.@AfterThorwing
# b9 i* W; X! R2 T/ S- H; C . i: w8 S# n1 a& m
5 \: D/ _- s* A
- 描述一下spring中BeanFactory和ApplicationContext的差别$ ~$ u; e8 d. }! Y, J5 \/ c
6 R: ^1 a \! s$ w9 p7 I
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”);
0 U$ c4 v6 @" N) r7 Q- 谈谈spring对DAO的支持; \6 T* S! l: h! ]6 e U7 x( f$ h
0 ~ W% \& N/ n8 Y0 v* U, _
Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。
+ i4 N! f! }6 r$ p" U4 { 简化 DAO 组件的开发。
! b4 @8 O0 D* x4 T- |9 T" d5 iSpring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。
4 t7 W h. x3 X+ P IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。
" e& v. d$ H: n1 \ {0 y$ k5 { 面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。* W& i& _& o, L! F: I6 Z2 S
方便的事务管理: Spring的声明式事务管理力度是方法级。
8 ^( m$ X# w4 U2 m! W/ l 异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。
9 e8 K! I0 C d1 E# }- z% m
6 h- T0 b0 o8 `3 ~4 q' J' D1 D& t8 ~% p# Q: S
- 谈谈spring对hibernate的支持. j9 x7 w% p0 n. s
6 R1 i% A( s8 A5 i+ H9 ^
在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。
# D2 m+ T( `5 T {; h3 V 一旦 Hibernate 处于 Spring 的管理下, Hibernate 所需要的基础资源,都由 Spring 提供注入。Hibernate 创建 SessionFactory 必需的 DataSource ,执行持久化必需的 Session 及持久层访问必需的事务控制等,这些原本必须通过代码控制的逻辑,都将由Spring 接管ataSource, SessionFactory, TransactionManager等,都将作为 Spring 容器中的 bean。将这些bean 放在配置文件中管理。
! Y0 `8 X: m# h6 `6 \: y, f! h 1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:
! \( \' C8 E, {' w5 q! d; t1 s 8 K: X0 B/ Z, W3 B4 d3 ^4 x9 d" t
class=“org.apache.commons.dbcp.BasicDataSource”>) j, D/ @2 ]7 ] |
* q/ z, q8 o+ ]
oracle.jdbc.driver.OracleDriver0 e% \% G, ?) G$ f: s+ H
6 {3 _6 P3 a _; H/ m* \8 k" ]$ N 1 X/ f' l6 i7 ^" ]' }
jdbcracle:thinlocalhost:1521rcl
. O$ k3 H+ G; m' v) } J% O
9 f0 U& u7 I+ q% l a W
7 M6 V$ E* Y. D) h javakc20 C4 h4 ^& s) M" p5 E p b, ~! a
+ b+ e5 ?) ^0 Z& Q1 U
- h" _, h. j0 j% u; T( Q2 l6 O! G javakc2
7 `4 U8 ~0 H+ u V7 H" ] 4 w# o+ f( k I; F$ G* Q
+ m. R- [9 k6 \
: a: f' P" U( o4 T, L. O8 [
class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>
7 k) n; `4 z" {: R% N. k% h/ e 4 j' j3 H& Y1 l' G
2 L( U/ Q% R: O) d1 s
9 N2 w7 z7 y( o8 }2 M
com/javakc/spring/h3/UserModel.hbm.xml# L0 \8 B6 n# [: [7 m* f$ A7 p
1 U* h( ^2 V. V! H) M1 M8 Y 9 X2 e6 u( R& G Z" k9 b
" r3 } ]; d' ]( [
$ }+ F) W% R) K0 z: e: e/ ~; K+ l hibernate.dialect=org.hibernate.dialect.OracleDialect
6 m. g" b( ? Q! C; z
2 C# J7 m2 ?, B5 o9 S5 ~ ! Z0 p' P; @0 T) H6 |# `
8 L% ^8 Z R/ E( s7 t/ t
0 W# ~7 u1 _9 a/ ^ 8 U2 D9 X( h" m; f6 k& F
8 a$ g Z$ G3 j4 M
如果需要使用容器管理的数据源,则无须提供数据驱动等信息,只需要提供数据源的JNDI 即可。对上文的SessionFactory只需将dataSource的配置替换成 JNDI 数据源,并将原有的 myDataSource Bean 替换成如下所示: class=“org.springframework.jndi.JndiObjectFactoryBean”>6 h9 i7 e( M5 o K- `" ?8 l4 W
$ m; I7 I: R3 o. U/ r5 X
java:comp/env/jdbc/myds
' r. p3 u0 f$ b9 |: I$ h8 x 5 c, R2 P: }# \0 R$ t- _
2、有效的 Session 管理: Dao类继承HibernateDaoSurport后,Spring 提供了 HibernateTemplate,用于持久层访问,该模板类无须显示打开 Session及关闭 Session。它只要获得 SessionFactory 的引用,将可以智能打开 Session,并在持久化访问结束后关闭 Session ,程序开发只需完成持久层逻辑,通用的操作则由HibernateTemplate 完成。 3、统一的事务管理。无论是编程式事务,还是声明式事务, Spring 都提供一致的编程模型,无须烦琐的开始事务、显式提交及回滚。 建议使用声明式事务管理,Spring 的声明式事务以 Spring 的 AOP 为基础。可将事务管理逻辑与代码分离。代码中无须实现任何事务逻辑,程序开发者可以更专注于业务逻辑的实现。声明式事务不与任何事务策略藕合,采用声明式事务可以方便地在全局事务和局部事务之间切换。 Spring声明性事务有两种配置方法,一种是xml配置:
( ~/ ^2 Y( B+ o7 F ' X/ r: d! f. T: q2 M
, C' r* |/ d E/ p 9 U) X9 ] c1 ]4 b3 S
" p. F$ D r Y8 ^. r
8 p1 y F' [3 y1 c) d7 a9 F
9 h" p; r9 G0 ~+ Y# l 4 \& x9 M0 [! K7 W2 _: p
1 E% F. W/ e# g/ ~# q4 I; v
8 [2 H- r4 w9 N9 L) H 6 u ^! A2 A( _# O* D
9 f0 x% D1 x# {; h# O1 f: t' a, }
) `/ l9 Y% l* B! O# G7 N; s5 I 7 B5 U* N% o/ y4 C
另一种是通过注解,在需要添加事务的类上注明 @Transactional 5 w6 ~' b* |% w# r# e+ [
Spring2.0之前事务的写法0 ?: |( I! Q7 Z3 P( o
; ]9 q2 |' T- Q1 C- V* S" m* _- E) O z( X- @/ o* O9 v2 w3 u
class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”7 q- _% S1 z% ^+ r
b( [) N% y$ w* n0 Q8 k8 Z abstract=”true”>5 |* W8 a4 W* l5 p
4 `6 b0 [' B% j% @. B; N2 D: O
+ X/ b( F- R$ c/ u9 Y9 n; a
* l! G; U3 I: K4 u
9 p; u. E1 Z4 @ PROPAGATION_REQUIRED,readOnly
4 G" j/ s, N x% }& i+ B$ V5 Y F% }! S1 A7 d* o* ^
PROPAGATION_REQUIRED! B/ @* `( z: r/ ]
" A, L' Z4 e3 f) o+ k4 j4 B$ h
1 }' @8 K9 v9 d
" X+ F! w$ m* e0 h! B) O& L J6 A/ W& C. l/ a$ q
| " d8 ^' E# C) B5 w7 K
9 R7 K9 J9 E$ j3 c- 谈谈Spring对事务的支持
( b ?0 I; @* y! H2 F; }+ }
7 O9 Z# I1 J+ x, Q* i% M
$ @9 }8 H* d( g) p" o* f
1、声明式事务管理: 1.流程:由客户端访问—-aop监控—-调用advice来追加事务 2.做法: 2.1 在配置文件的头中引入xmlns:tx 和schema的文件 2.2 2.3 注入数据源 1 r+ Q$ ]# S2 j" f
; O0 e7 U" N" b6 H# s# i# I
; U; y9 `2 u1 v0 L( W
4 o l( T6 V' e$ O) Q
" Z. H1 @. ^& u6 m8 _3 j, V9 R2 Z, ?- _% R c' V+ r
2.4 由spring实现的事务管理,但需要注入数据源 & D2 R: k9 i' C0 s. Q( \7 Z
( A! u- _# s) h- r% U/ `. Y M% S5 W: m) b4 u
2.5 事务监控所有的方法(事务加强)
: l- f5 ?& } K1 m% D; `6 e2 R5 F( S, ^% ?
U, u1 c- p) Q+ G; q* Q3 Y! S" _1 t' c+ a9 g
; o+ ~, n8 Y0 L" U4 C2 V2.6 定义切入点 % U9 w$ C' J1 P
6 L% v! h# i/ ]0 c: Q/ a! q4 [: V7 y' l5 @) b
/ X$ B) {3 u' Z0 s' F% `+ D! _- E
& }3 @' O3 ~5 Y2、使用注解实现事务管理: 1.注解@Transcational (可以在类上,也可以在方法上) 2.在配置文件中同样需要注入dataSource和spring的事务管理 3.使用注解的方法来追加事务 注解驱动 5 \" L# L& } i7 Z. t( P" R
6 }& D* n9 M! E* r如何在Spring中使用Hibernate的事务:* t7 ]6 _! Y; G7 k' @* ^
# d4 n6 W g8 s) r) A
7 [0 W9 }' l5 g: Z/ L" H; H h4 ^
; A4 D: T' k. L如何在Spring中使用JTA的事务:
! u B( Y1 Y I$ J
1 i0 ?( X" R; j t8 k5 p. u" Q |