该用户从未签到
|
Aop 面向切面、面向方面、面向接口
5 s& V# K: G1 y# k m 程序中涉及到公共问题,集中解决( t' Y4 N6 h( S. g; I. z
spring Aop中使用就动态代理# U% h$ Q6 O9 H& s
1、实现InvocationHandler4 y1 D: q- J3 Z1 a8 d" `, l# C8 W
2、生成代理对象0 f( F; n) r5 Z
Proxy.newProxyInstance(objectTarget.getClass().getClassLoader(),- ?4 o6 ~: G) o, T0 O1 `; Q" L
objectTarget.getClass().getInterfaces(),
3 p. {3 S* m) ]: R this)9 {( }* y0 U6 c1 w; c0 z6 Y
3、编写invoke方法
5 j/ N0 x4 `; S- M& _ 执行newProxy自动执行invoke/ V8 e+ O9 Y: @+ Y
8 t2 ^, }8 _7 }6 j: Y+ q4 V5 g7 G & o; Q" Y' O! r" |) h+ X
AOP相关概念
2 O2 a$ m" U# v% j8 Z5 c- g- @ 1、关注点(concern)1 j3 @7 L5 l: `: C5 u, Q/ T
一个关注点可以是一个特定的问题,概念、或者应用程序的兴趣点。总而言之,应用程序必须达到一个目标) P. H6 R+ t: M# g
安全验证、日志记录、事务管理都是一个关注点1 I8 g* N6 d: a3 x* g
在oop应用程序中,关注点可能已经被代码模块化了还可能散落在整个对象模型中# Y& z" m. t' ]. U6 r
2、横切关注点(crosscutting concern)# i0 D( v+ i4 e9 P9 w/ A" V
一个关注点的实现代码散落在多个类中或方法中
k( u9 O; R. S" `4 E) w3、方面(aspect): P+ k/ V2 t5 G/ g5 [8 D
一个方面是对一个横切关注点模块化,它将那些原本散落在各处的,
j5 P' g" u2 z# p7 [, |7 a 用于实现这个关注点的代码规整在一处/ }: D; d! C. Q5 }8 b
4、建议(通知)(advice)
% r0 g3 M0 ^* D" @3 _ advice是point cut执行代码,是方面执行的具体实现# A. J4 S! p2 G3 V, N9 O( g' B
前置、后置、环绕、异常通知+ B- ]3 k. T* @8 _2 _9 \2 P
5、切入点(pointcut) add*% B/ T3 F1 J3 I0 \! k
用于指定某个建议用到何处
9 J) z# d/ S9 J- g6、织入(weaving)
% N) [0 s4 d9 R$ o# W 将aspect(方面)运用到目标对象的过程( l: D# Q0 h$ \* g/ `4 {) h2 t
7、连接点(join point)+ _2 t0 o: D ^. H( X! k6 c1 h5 W
程序执行过程中的一个点+ S" m2 y% ~- ?: n
. p# ?# d" Y( P2 u R( A& J( Y8、targetObject 目标对象9 P3 r! C1 p- o- Y3 p' W, S
9、proxyObject 代理对象
" Q+ I: E1 P5 L
& i# V3 _, b$ _4 S. ~$ qspring AOP主要是使用是动态代理机制 5 c( P' \0 t' E. {
spring AOP 完成日志输出
1 {; T3 k+ t2 V# U$ r" o 前置通知3 ?' [/ Y. c% p$ T: f; Q
(1)创建目标对象9 l: y+ K8 U8 ?
(2)创建前置通知# J2 a ?( ?! B" Y: b
实现MethodBeforeAdvice8 L$ m( f/ a) {* m& f/ M
完成before处理: M$ x& M4 e$ s' }% \$ f# a
(3)完成代理工厂类装配- `/ c( B' c; E+ E- ?
(a)代理类接口8 z1 \" K9 P* X9 e
(b)通知7 o+ p. w" l# h9 \' k9 K, v) E
(c)目标对象# d, m0 u6 _% X, Q, Z+ }. A% D' K
: e6 z; \! h- j/ h( R, R9 E
|
|