该用户从未签到
|
Aop 面向切面、面向方面、面向接口
$ o' c/ F. \6 i 程序中涉及到公共问题,集中解决
) X) j! K5 U) ^' }) h8 z; R- Tspring Aop中使用就动态代理
1 v9 q2 h; Q; m# ^# } 1、实现InvocationHandler
& y; s! l8 |% n9 f- \8 f( L 2、生成代理对象5 o* u7 y7 j2 n' e+ u! `- b
Proxy.newProxyInstance(objectTarget.getClass().getClassLoader(),1 T+ K" \2 R6 F, E0 ^
objectTarget.getClass().getInterfaces(),
; I: Y$ f9 A! j* Z& t this); O5 S2 a+ S3 Y3 [. ?" h$ T
3、编写invoke方法8 j, Y' Q% V, c q7 M
执行newProxy自动执行invoke7 C' ]; ?5 [& b- w. R# T
% G# q3 E1 ^; ?% z c! y3 Y
. L; C' Z8 I. h1 qAOP相关概念
$ C% j( ?: |* @( F6 i5 h 1、关注点(concern)& \- q/ }0 F j' y ^- X n! Z
一个关注点可以是一个特定的问题,概念、或者应用程序的兴趣点。总而言之,应用程序必须达到一个目标5 d- E$ [' x2 R% f6 P) }; t/ |
安全验证、日志记录、事务管理都是一个关注点
8 m0 @# d# P4 Z2 u% p 在oop应用程序中,关注点可能已经被代码模块化了还可能散落在整个对象模型中5 O2 b# F! w c( `. h
2、横切关注点(crosscutting concern)+ X6 ]5 k: V ~5 B3 F0 v3 F
一个关注点的实现代码散落在多个类中或方法中
& y6 J- h- b8 l' c$ q+ D* m3、方面(aspect)
: C4 M' X* L3 S+ S 一个方面是对一个横切关注点模块化,它将那些原本散落在各处的,
1 ]- t+ A9 P \: T/ S/ { 用于实现这个关注点的代码规整在一处. R3 Z/ _1 c1 L1 F7 B
4、建议(通知)(advice)0 f- ?+ T# w$ b' v
advice是point cut执行代码,是方面执行的具体实现
$ y, t; _) y d5 a3 I! N8 U( p 前置、后置、环绕、异常通知/ |0 i# ^" {6 e
5、切入点(pointcut) add*7 L" i, N; S+ L- g' O# V
用于指定某个建议用到何处5 a1 z* o- y8 h) \/ \: h
6、织入(weaving)
# K& K; d/ J5 F% n9 u: m; f) N5 S9 ~ 将aspect(方面)运用到目标对象的过程
$ v8 J7 _" o+ f) x+ @7 k7、连接点(join point)+ N/ [5 I! m; E# }' X' U. H, C- h7 C
程序执行过程中的一个点4 ^3 G2 g! ~- G) A% c4 [/ e, \) |
' u3 s+ s' i2 w* Z' z8 p8 R% O0 f8、targetObject 目标对象2 y! s4 R+ v! B% e6 K
9、proxyObject 代理对象
" V0 f% f- G H3 H
0 ?5 z; S9 J1 K0 f' y; X; Xspring AOP主要是使用是动态代理机制 % o9 B. d6 J- h2 A5 ?1 l7 b
spring AOP 完成日志输出0 U0 T- T* y5 a+ |
前置通知
* x6 y O! d8 ]5 R4 t( _3 V! \ (1)创建目标对象
# t2 U; l% {, B" d (2)创建前置通知
|1 }0 G9 W! \& w6 B, h2 S$ P 实现MethodBeforeAdvice
/ a3 ?- @$ l: e+ E0 X3 C 完成before处理! {0 N: g. ^$ j
(3)完成代理工厂类装配2 y7 B. g5 y. v$ X; L5 z
(a)代理类接口
5 j* q1 `* [3 c9 [ (b)通知
& M# U8 H9 |1 j" [ (c)目标对象" s c3 a, a/ l6 n
2 M* B! D# {- S
|
|