该用户从未签到
|
Aop 面向切面、面向方面、面向接口) b( C& e, M: v
程序中涉及到公共问题,集中解决
" H1 q) m r" Y8 X2 ispring Aop中使用就动态代理
7 ?" S& @8 _8 w+ x8 }' o1 k- Z. G' D9 a 1、实现InvocationHandler2 v2 o, g; y" v
2、生成代理对象
* z( K! ?% u+ Y; V Proxy.newProxyInstance(objectTarget.getClass().getClassLoader(),
7 L, H! u2 N0 b3 T objectTarget.getClass().getInterfaces(),) f4 o) d! q- } x6 m4 ~9 k
this)
' Q" V) D D" i3 Z 3、编写invoke方法- z% ]3 ]) q" y
执行newProxy自动执行invoke
, A ~+ m) z4 x: H * P0 t( D; } c
0 l6 Q( `! J$ b6 v0 ~8 \
AOP相关概念 ' d8 Y# Q6 T; }# \' ^+ ~
1、关注点(concern)
0 C) R6 y7 @8 F8 l- c" D 一个关注点可以是一个特定的问题,概念、或者应用程序的兴趣点。总而言之,应用程序必须达到一个目标
' F1 c4 \' k+ @* t# D( N 安全验证、日志记录、事务管理都是一个关注点
$ [4 p {" ?. S1 N0 q 在oop应用程序中,关注点可能已经被代码模块化了还可能散落在整个对象模型中- h: a6 ^9 n7 V9 Z' c
2、横切关注点(crosscutting concern)
1 N6 L1 a) |$ c; z 一个关注点的实现代码散落在多个类中或方法中: r/ E; B' O$ A R
3、方面(aspect)8 v8 X% m; ] p, ]0 M. u" P) j
一个方面是对一个横切关注点模块化,它将那些原本散落在各处的, o/ @3 B/ J' X2 w
用于实现这个关注点的代码规整在一处
9 [0 m( O$ e; ?4、建议(通知)(advice)6 s. g7 P" c1 D$ p+ H0 i: c I
advice是point cut执行代码,是方面执行的具体实现, ~/ K( f; D# o: P) W' a! h
前置、后置、环绕、异常通知
* J3 A( d# B: s5、切入点(pointcut) add*! E$ w2 o2 {3 g
用于指定某个建议用到何处
7 ^) {2 {/ }' a3 B# s6、织入(weaving)
5 g0 q( y0 \% I& D) o0 X 将aspect(方面)运用到目标对象的过程
/ [2 {' v) k, Z, `0 H/ u1 q7、连接点(join point)
/ h) d- q. p) w' q/ }) r 程序执行过程中的一个点
% e# y' v! r) n% [% ]& E0 h+ [: Q5 W* M- \9 a# r
8、targetObject 目标对象
6 J6 q2 \# ?) A' Z9、proxyObject 代理对象- ?* B& R. Y2 `" [$ w
$ U y& N0 [9 zspring AOP主要是使用是动态代理机制
1 b0 T4 L! a1 B% `spring AOP 完成日志输出; M6 O9 f3 m/ U( ^
前置通知
- @+ Z! q* L, F L5 l' }# B$ ~ (1)创建目标对象, L* r: [& O0 U( T1 \2 J
(2)创建前置通知
% A/ x+ G8 A4 T6 \7 \; K2 Y 实现MethodBeforeAdvice! @' S8 @6 I6 F$ ]
完成before处理: H8 i T' B5 o: l8 c7 o& z
(3)完成代理工厂类装配
3 O, ]5 B2 h% o& @/ T0 {9 J (a)代理类接口: O( m: c# W8 B" ]7 i8 N" P; f9 Y
(b)通知1 w. Z r/ j6 p7 d2 A0 a- ^7 v0 v/ m
(c)目标对象2 e9 i9 z1 L1 u! P
# j2 G- \# W7 X: H |
|