该用户从未签到
|
Aop 面向切面、面向方面、面向接口8 L0 x+ s) w, G% h- k
程序中涉及到公共问题,集中解决
9 D8 ^( e+ T8 s+ T2 ^5 P/ p* \spring Aop中使用就动态代理, P' ~5 \" `8 a3 J1 z4 ^' P
1、实现InvocationHandler N; e0 ~+ f: ?
2、生成代理对象 E2 U9 t7 N1 P& W
Proxy.newProxyInstance(objectTarget.getClass().getClassLoader(),
8 @8 F* F/ \: d* n* y8 j objectTarget.getClass().getInterfaces(),. V& q- E& D1 Z2 _- i" C8 T
this)
0 D: f# R) Z. c' F. i1 C8 x% b) c 3、编写invoke方法
4 r$ K, t! c$ h& _; [ 执行newProxy自动执行invoke/ `5 U$ L% N0 X
L4 I v/ O" V9 \1 V
, @/ t3 m) y9 s1 R) W s& C fAOP相关概念
; X: u5 W5 z' w2 Z6 J 1、关注点(concern)
) P p* j( U0 F+ f6 X 一个关注点可以是一个特定的问题,概念、或者应用程序的兴趣点。总而言之,应用程序必须达到一个目标; u) e3 q: j; }, y% O# i' I
安全验证、日志记录、事务管理都是一个关注点
/ W5 o3 {* E0 v3 Z8 r- T$ q 在oop应用程序中,关注点可能已经被代码模块化了还可能散落在整个对象模型中
4 n* \) R! d+ T. z) ^1 f2、横切关注点(crosscutting concern)
1 l! K5 t- `1 W. L% A: D; X: b 一个关注点的实现代码散落在多个类中或方法中( q0 q2 ?( Y5 E8 v+ P- u
3、方面(aspect)# B. L9 N1 K/ {" R8 i+ m4 i
一个方面是对一个横切关注点模块化,它将那些原本散落在各处的,
. K, g5 C" |, ] |+ K" ?8 [, ~ 用于实现这个关注点的代码规整在一处: k! n1 b6 F; \
4、建议(通知)(advice)
! T W+ N" R. } n' @* ?3 @2 b. z t advice是point cut执行代码,是方面执行的具体实现+ R% j* G2 @% y; F5 p% w
前置、后置、环绕、异常通知
% X4 R0 P/ U* z" r! y. [2 Z7 D3 E! B' N5、切入点(pointcut) add*4 g) g) C4 A$ P( w* Q; {
用于指定某个建议用到何处
/ K1 o. O8 `7 G3 G- i6、织入(weaving)
8 B; G( N, `4 t( g 将aspect(方面)运用到目标对象的过程
- w# i: V ~2 U! L# z7、连接点(join point)" n% L0 }# P2 r& S I v$ I# j. `
程序执行过程中的一个点
0 W8 [3 ~" i8 Q0 o0 q3 c9 {* y% F; ^/ {8 m$ N! H* d
8、targetObject 目标对象: D' Q2 i: F; q5 A; L r$ y
9、proxyObject 代理对象* `, m6 p! ?. F4 t% o! R7 \ b, r
+ s$ X% N. m3 c4 n& H5 `spring AOP主要是使用是动态代理机制 * y& b, ]" P2 t# ~' W; J+ v7 @1 W
spring AOP 完成日志输出- g) o6 r& a' w+ G7 _# I/ F
前置通知) E5 o1 ]9 n$ J
(1)创建目标对象, R$ f! P6 `1 [1 w
(2)创建前置通知 E6 S- M) s/ P# e [
实现MethodBeforeAdvice, |/ I7 Q: E% n3 t5 I- b+ |+ P* H
完成before处理
0 E* H4 s: e' B% {3 {6 ] (3)完成代理工厂类装配
4 Q' [( l8 A3 b( P (a)代理类接口
& |9 S5 x3 ?, x$ ` (b)通知
5 T8 q# S) }+ Z+ C$ e (c)目标对象
' _9 U n- r3 }% W0 s( Z+ N: J/ {- p) j( J
|
|