该用户从未签到
|
Aop 面向切面、面向方面、面向接口
5 K- t9 o1 ]+ s& d* X 程序中涉及到公共问题,集中解决
1 B6 c' p$ m: w1 Rspring Aop中使用就动态代理5 T6 x# _) R/ N2 @1 d
1、实现InvocationHandler: n, m5 ?! D- O
2、生成代理对象. w: G7 C: A1 Q/ B
Proxy.newProxyInstance(objectTarget.getClass().getClassLoader(),
5 F* L, P" e' N- c5 @ objectTarget.getClass().getInterfaces(),! `0 C2 f, M) ?0 \: h2 Z" {
this)) B: \/ c' A8 r& |/ g* g3 Y f
3、编写invoke方法
4 ^( d( K$ V% r% T7 z 执行newProxy自动执行invoke
- Z8 ?, C+ E" D# C; k3 G" V ' b/ V3 R0 e% c7 z6 }( i
) v6 v* e7 Y" Z5 i) ]AOP相关概念 6 h5 q% N: D; g l7 [0 |
1、关注点(concern)4 ~, n5 b- R) J/ \+ d( S6 h
一个关注点可以是一个特定的问题,概念、或者应用程序的兴趣点。总而言之,应用程序必须达到一个目标' M; P! z3 u7 Z% T6 E
安全验证、日志记录、事务管理都是一个关注点$ W, ]5 G6 T/ ]) P# r/ t
在oop应用程序中,关注点可能已经被代码模块化了还可能散落在整个对象模型中
" ?$ _. E( M7 L) J1 ^" [0 `+ x5 k2、横切关注点(crosscutting concern)! }# p$ z ]* K
一个关注点的实现代码散落在多个类中或方法中' t! D/ _; v7 a% [+ V1 T. r2 L, y
3、方面(aspect)+ A$ {1 k B' x
一个方面是对一个横切关注点模块化,它将那些原本散落在各处的,1 @1 C. B1 E/ @- e0 y
用于实现这个关注点的代码规整在一处! t+ C$ T' I4 Q
4、建议(通知)(advice)
& B* ?1 Y0 I# Y# O( ? advice是point cut执行代码,是方面执行的具体实现" C6 o9 k/ x; i9 a7 L/ M
前置、后置、环绕、异常通知
$ J# O* i) p; D5、切入点(pointcut) add*
/ ?) S: B6 b$ J I* t8 } 用于指定某个建议用到何处" P: ^. [' _. Q1 L" S# B3 k0 `5 \
6、织入(weaving)
: ]0 C% p/ ^ ]- H1 K8 J! Z& I 将aspect(方面)运用到目标对象的过程$ ?0 q9 z4 b0 L# q3 E
7、连接点(join point)% a$ W1 b$ M% g8 x7 s
程序执行过程中的一个点
6 b& ?' Y/ ^8 b' Q' e( Q R9 J" v/ F# R7 e9 R
8、targetObject 目标对象! {- u* i, V( @% d5 y, o3 O2 M
9、proxyObject 代理对象
& d9 J' {: w; ?( [4 O
3 n) T K6 [* i% tspring AOP主要是使用是动态代理机制
w4 W0 x: q ospring AOP 完成日志输出
( S$ N$ J! }2 S$ Y- Y' Y% B* v2 s5 n 前置通知5 T" G1 S1 }: u. G. N
(1)创建目标对象
+ Q$ @& D5 E" ~: U, l4 p/ A (2)创建前置通知) l% B3 c3 Q" j6 n' L- w2 a1 P* I
实现MethodBeforeAdvice
& x+ D. t1 c7 {" H+ Y5 F8 \) o 完成before处理
1 `. D; h( D t3 t4 m9 ?& ] (3)完成代理工厂类装配
0 `$ Y" q2 o- S2 n (a)代理类接口
9 y" p. {: d# r* x1 B2 | (b)通知: K' f# A- e2 M' F& L
(c)目标对象' U/ n, K- j0 k
( o% M6 l( @+ W
|
|