|
该用户从未签到
|
Aop 面向切面、面向方面、面向接口" |: O8 c& r) Y. X6 o
程序中涉及到公共问题,集中解决
! Z" Q, q' ]3 espring Aop中使用就动态代理. t7 Y; ?* H9 @: s6 e; U
1、实现InvocationHandler7 o2 H. Q# X; h! y7 Q' o
2、生成代理对象
: B+ Y2 b" V* a" B: F Proxy.newProxyInstance(objectTarget.getClass().getClassLoader(),
9 M, p" F4 J2 M$ N5 d0 ?* X objectTarget.getClass().getInterfaces(),
$ Y5 V. @9 p; L5 b this)- Y+ c( ?! y. R$ C1 N) H# A
3、编写invoke方法
/ \0 [2 y0 t- G3 _3 T7 u8 q 执行newProxy自动执行invoke
& K: W N, L2 q
4 m- Q' Z4 u' I" }; B7 N3 n
7 k- {* Y3 i: ~3 bAOP相关概念 , } p/ v2 q P) ~6 r" w
1、关注点(concern)! @ m+ F8 H: K# A( w
一个关注点可以是一个特定的问题,概念、或者应用程序的兴趣点。总而言之,应用程序必须达到一个目标
& [4 ?) X" D2 Q& K6 ]0 j# q( P: u 安全验证、日志记录、事务管理都是一个关注点, B/ m- k9 w) C8 ?* A$ y
在oop应用程序中,关注点可能已经被代码模块化了还可能散落在整个对象模型中* N/ ?# t; \0 q3 y
2、横切关注点(crosscutting concern)" C w8 R$ g; b
一个关注点的实现代码散落在多个类中或方法中9 ~' f* W2 o& f/ m
3、方面(aspect)2 p& ?$ V. C" i( W% r
一个方面是对一个横切关注点模块化,它将那些原本散落在各处的,
a2 Y( _( X" p8 m6 D I 用于实现这个关注点的代码规整在一处+ s* O" L& l5 \
4、建议(通知)(advice)
- c" ^/ _' k% S6 W' q& O advice是point cut执行代码,是方面执行的具体实现% ?* `: P4 q& J% A
前置、后置、环绕、异常通知4 I$ h" W# N0 l: X
5、切入点(pointcut) add*
+ T+ P; b4 C: g8 _( g P- g 用于指定某个建议用到何处
/ ~* |4 [5 B. V! L0 w: Y. ?- T0 |6、织入(weaving)
+ B/ P/ X4 n/ i* M7 w7 A# ^4 y9 e 将aspect(方面)运用到目标对象的过程
2 u; R( _; j* ~7 W; g' _8 K7、连接点(join point)
9 i$ r4 e" E/ i; H; X5 ?+ @2 k: u 程序执行过程中的一个点
# \+ h5 L0 k: S! E9 I; N6 h
* m8 P8 x+ k) X0 h4 \$ q8、targetObject 目标对象
1 h, k: Y1 s) `5 h' E0 K" y9、proxyObject 代理对象' N- E) ]3 @6 b
3 n) T' f0 @ m" } s/ [$ Q+ Y
spring AOP主要是使用是动态代理机制
" l: H8 U ~+ Yspring AOP 完成日志输出 s- Q% O! X' O. P
前置通知
1 d) X0 {0 }2 u! L* F (1)创建目标对象
$ p/ {0 ~9 w2 G' u' x" j2 E' } (2)创建前置通知/ Y+ m3 |% i9 Y) S) g! N- @; i7 g
实现MethodBeforeAdvice& C6 |0 B9 B7 Q7 J4 N
完成before处理
* l/ g' P% t/ t8 z- k4 x* q, k (3)完成代理工厂类装配
: ?3 q5 B! k, R% N- n (a)代理类接口
' W4 e5 X. J; I7 _ (b)通知
+ t% [: n; h& o2 Z (c)目标对象* K) t. f" u8 P6 W% \
+ v% ?% P0 ~1 |$ l f* w1 b! Y |
|