该用户从未签到
|
Aop 面向切面、面向方面、面向接口
2 K+ m" n$ s+ E 程序中涉及到公共问题,集中解决
/ A6 Q8 p+ K* I' V( ~spring Aop中使用就动态代理
+ n* s6 L( t" R 1、实现InvocationHandler
4 V3 D' H& {: M- p2 V) e3 a 2、生成代理对象; w0 b- s* C8 T9 W2 _
Proxy.newProxyInstance(objectTarget.getClass().getClassLoader(),
- c. c W+ J# e8 A1 k objectTarget.getClass().getInterfaces(),
* J- {. @+ J# P' }/ Z% D9 q) |- { this)' i) A6 }1 y0 c" l" M% k% q
3、编写invoke方法
& d4 |) _1 |2 C( B; {2 @5 r 执行newProxy自动执行invoke7 F- B- U5 y a. P B8 y
' ? a ^. x6 R W& T
* f0 Y. Q* ?6 a
AOP相关概念 + p( i4 }+ S: M m& K
1、关注点(concern)
$ E3 d+ O4 p9 m+ N$ k 一个关注点可以是一个特定的问题,概念、或者应用程序的兴趣点。总而言之,应用程序必须达到一个目标, z+ c o5 O# W+ A% c
安全验证、日志记录、事务管理都是一个关注点
0 X) x" Q# s, Y 在oop应用程序中,关注点可能已经被代码模块化了还可能散落在整个对象模型中& L+ b; ?3 K2 w; a( ~+ z5 l7 I
2、横切关注点(crosscutting concern)( `6 w" Y8 v, N9 |4 }- Q
一个关注点的实现代码散落在多个类中或方法中7 a4 o, p* k' A! }
3、方面(aspect)$ j' P' P; i' p, Z
一个方面是对一个横切关注点模块化,它将那些原本散落在各处的,4 M3 b& ^. v- B# x: S- U
用于实现这个关注点的代码规整在一处
! I5 H* N6 K% Q+ m3 M- e( B1 S( l4、建议(通知)(advice)
' Y: v# c" Z$ g4 E2 X0 O advice是point cut执行代码,是方面执行的具体实现
3 H6 K5 J2 O' _& Y7 l, f 前置、后置、环绕、异常通知
: s4 x" r- P* Z7 \5、切入点(pointcut) add*
6 N' M8 y. g0 q2 u9 d/ q3 T6 k7 O 用于指定某个建议用到何处
* h. ^/ p, q! u, [8 b6、织入(weaving)
) S2 g: X8 C" K" l7 g 将aspect(方面)运用到目标对象的过程
" z& J$ J1 C" Q6 L! {7、连接点(join point)
( t! C. H9 C! H2 @ k" g 程序执行过程中的一个点
8 Y9 |/ n; ~) \8 L" B
4 z$ T- Y( M% W8、targetObject 目标对象
8 a5 B# g$ k# q9、proxyObject 代理对象9 q7 x& f0 V* K: n- ~- K
5 Q! `# c) g: K6 `: m2 Vspring AOP主要是使用是动态代理机制
$ @+ A0 F$ z0 P% Mspring AOP 完成日志输出0 b5 X9 M. W. Q6 r* c; |3 y! n2 B
前置通知
' _# q# W6 A6 C. @4 ^* N5 I0 E+ U (1)创建目标对象
2 v5 Y0 |% E, ]! F' x8 d$ R (2)创建前置通知+ ]6 p0 ~, I- w% i) I
实现MethodBeforeAdvice7 C! J& ]) i4 Z$ @# z) m: H6 X# u
完成before处理
; ^; M' j. `. _, {% ~1 d (3)完成代理工厂类装配9 l) X: m: g! Y* o& T2 P; O$ ?4 Y3 F
(a)代理类接口# n# u p3 ]7 v3 A, E! C. W
(b)通知 w& H* [1 N4 \
(c)目标对象
3 \9 y X6 w0 Q, N! Y- n- X( z$ \3 h
|
|