该用户从未签到
|
Aop 面向切面、面向方面、面向接口
1 ^' p$ E9 d' d" H7 h& b% Z: o2 K 程序中涉及到公共问题,集中解决4 {. v5 [8 r6 |/ U
spring Aop中使用就动态代理1 F- Z% [" d3 F1 N2 n I* X/ ?
1、实现InvocationHandler: [; N8 i: z4 Q F
2、生成代理对象# ]8 L7 U; C. M2 G* e' h
Proxy.newProxyInstance(objectTarget.getClass().getClassLoader(),2 X3 L- S. i" x$ R3 Z# I \
objectTarget.getClass().getInterfaces(),. `8 L0 E- V' G \
this)
* m8 Q5 C/ K( q9 P# r( X; i4 U 3、编写invoke方法: { n6 Z# h6 ~0 E5 E
执行newProxy自动执行invoke
! A7 ~+ l* {3 H* U
$ b3 F6 n( I" H. {1 a# r 3 n4 q" o7 @7 V8 I
AOP相关概念
% g: q5 V$ N& m0 C/ V W 1、关注点(concern)
; n7 \6 W+ L2 q4 {+ f: u 一个关注点可以是一个特定的问题,概念、或者应用程序的兴趣点。总而言之,应用程序必须达到一个目标8 f" _1 B. T& r7 L7 G0 b
安全验证、日志记录、事务管理都是一个关注点: z6 j, l# [7 C, Y
在oop应用程序中,关注点可能已经被代码模块化了还可能散落在整个对象模型中, A* f' R8 b8 o
2、横切关注点(crosscutting concern). Z- N$ @/ O+ u' x( E$ O
一个关注点的实现代码散落在多个类中或方法中+ x: d0 C B+ w* z9 }9 |, ^( s4 D
3、方面(aspect)+ ^0 Y) o* O8 F
一个方面是对一个横切关注点模块化,它将那些原本散落在各处的,
. ]" U9 T4 }1 H* P. U( `3 h3 A 用于实现这个关注点的代码规整在一处 o) [/ r/ E& u! e' _- i
4、建议(通知)(advice)& x) |3 q" B7 v( H! P7 j
advice是point cut执行代码,是方面执行的具体实现* |4 ]4 T9 F" H2 s
前置、后置、环绕、异常通知
$ L l& i2 y; L5 ?: n5、切入点(pointcut) add*
* C: V, o3 x3 i) M2 q B j 用于指定某个建议用到何处
: h8 U0 ^6 _- S& P6、织入(weaving)
8 ]! X' P4 C$ x4 W# A 将aspect(方面)运用到目标对象的过程
% ]4 @9 |, o& @7、连接点(join point); m' v G9 i; h! M' A
程序执行过程中的一个点
2 x; X7 g& z- r! G
, e3 Q a4 R! U6 ], b3 i- H8、targetObject 目标对象1 k4 A `: G3 A% \
9、proxyObject 代理对象 H U; U% ]0 e, q/ ~
" o6 {! u' ?# J
spring AOP主要是使用是动态代理机制 ) M a3 Y: C3 B1 p: i% R
spring AOP 完成日志输出% p# j9 [' x/ T' X5 v2 C, j
前置通知! h, _5 r. `5 Z9 W8 [6 j3 Z
(1)创建目标对象/ B; ?4 A8 I w0 [1 y% |9 D7 e
(2)创建前置通知
6 u, X. ]/ _% `" Y& Q9 k 实现MethodBeforeAdvice
' J' C3 O7 T3 ~; D 完成before处理, \% _& ~0 z# @6 ~8 w
(3)完成代理工厂类装配
' n: g% W! T( Y4 j$ U (a)代理类接口( P* P; K) W. r0 _
(b)通知
/ x6 h" v( v" |8 O4 P: K/ \, q (c)目标对象! V5 N4 p1 C# P
$ ^6 V7 r+ C# m" N+ N |
|