该用户从未签到
|
Aop 面向切面、面向方面、面向接口
, O& `$ ?6 \) L3 B 程序中涉及到公共问题,集中解决; X, K0 F6 R' `; [( R- Q
spring Aop中使用就动态代理0 i: c% J m. n3 ^! l
1、实现InvocationHandler
5 `6 o, y& i' g% B0 Q 2、生成代理对象5 c( b' G3 r5 x# Y5 \
Proxy.newProxyInstance(objectTarget.getClass().getClassLoader(),5 A! O* r, M: J. W1 c2 Z8 j
objectTarget.getClass().getInterfaces(),6 @1 s A# u4 t9 ]# ]# j
this); z7 n- _4 G8 |7 ]1 u% R/ r
3、编写invoke方法/ l! D- I* @2 w- G( B7 F% C
执行newProxy自动执行invoke* ]+ I! g8 E* Q& s5 H# T7 l
" b7 m' ?% N" x- _
+ r5 q5 C0 S/ _( @' q7 ?
AOP相关概念
; F) d7 l+ c) l3 b6 T 1、关注点(concern)
- K- m) U9 b7 j% c 一个关注点可以是一个特定的问题,概念、或者应用程序的兴趣点。总而言之,应用程序必须达到一个目标
% Z9 u9 q2 L; C1 p+ u 安全验证、日志记录、事务管理都是一个关注点
6 v1 f" k$ `4 y 在oop应用程序中,关注点可能已经被代码模块化了还可能散落在整个对象模型中$ y; c7 Z% j) t/ P
2、横切关注点(crosscutting concern)
- C' d8 }/ t% Q5 x 一个关注点的实现代码散落在多个类中或方法中
; U" @5 M6 F& [! b x4 j3 q( F3、方面(aspect)
1 P% `; f- L3 V6 }. g 一个方面是对一个横切关注点模块化,它将那些原本散落在各处的,: E n1 Y! ~9 c8 {+ F( U& G" A0 k
用于实现这个关注点的代码规整在一处% x* S! ^7 z/ i+ H, ?
4、建议(通知)(advice)' a( o$ x' n7 I! f
advice是point cut执行代码,是方面执行的具体实现' a, n8 T G. I
前置、后置、环绕、异常通知
& |) d) Q( h+ \0 u5、切入点(pointcut) add*
/ L6 L2 Q" A2 w0 i2 j* Y 用于指定某个建议用到何处/ A5 K1 b. ?) n) w9 C
6、织入(weaving)
# Z% E$ J6 Z, P- o! G$ \ 将aspect(方面)运用到目标对象的过程9 K0 b7 i* ~: c) s
7、连接点(join point)$ S- V# u+ H! T5 L9 K, ~
程序执行过程中的一个点' i. h) J4 [" n
" a8 X" |1 n- z6 V5 c( }5 `" n" K
8、targetObject 目标对象# `; D2 V+ ?+ u; R
9、proxyObject 代理对象/ q1 s$ b: D% v Q
% r6 o( i0 q: K. e0 [! aspring AOP主要是使用是动态代理机制 ) F3 F% P. j, @5 s+ d- k
spring AOP 完成日志输出. H5 ]. {3 z# j1 |) e8 @
前置通知% t5 J& }7 L8 N# }9 f4 C) T0 p' i
(1)创建目标对象! w8 I+ I# I* X6 c; G
(2)创建前置通知
- D# a! T5 d4 V3 H 实现MethodBeforeAdvice7 n* m2 j1 B8 X0 q5 c# t$ C' t ~6 Z
完成before处理8 Y9 e, I9 E0 T) u) B+ S
(3)完成代理工厂类装配- t, |$ `/ c9 ^* {" n
(a)代理类接口
8 S H( G2 p* _9 K9 L (b)通知" E: _# U% W7 `: g0 v9 w
(c)目标对象# B9 V7 [9 h7 q+ ], D5 e
: G/ q1 |7 s Q+ g/ n |
|