该用户从未签到
|
Aop 面向切面、面向方面、面向接口* _! _ s' ]7 N& o
程序中涉及到公共问题,集中解决0 J7 w/ a3 Q" o; R! f4 D, L
spring Aop中使用就动态代理
?/ h% O3 G* H& F/ U 1、实现InvocationHandler$ k' k0 [1 j8 N1 y6 J
2、生成代理对象+ P; p& O) X' M( R% T8 G/ [
Proxy.newProxyInstance(objectTarget.getClass().getClassLoader(),
. D( Q3 A4 m3 S) B( c* b objectTarget.getClass().getInterfaces(),
: g' n7 ]% o; ]2 j4 m- L this)3 a' @1 {4 ]4 a0 S& J5 W
3、编写invoke方法1 N; G4 w) x% J, @! T F4 D
执行newProxy自动执行invoke
* B Z. w i( F 7 j1 x$ B$ _/ A7 @ `: J
; {3 V; q& [- t) ?1 mAOP相关概念
- u5 X4 y) ~. B( \ 1、关注点(concern)
$ \- E$ L+ r9 u" [% Q* J 一个关注点可以是一个特定的问题,概念、或者应用程序的兴趣点。总而言之,应用程序必须达到一个目标
$ l1 c" I: ~ w/ F8 m 安全验证、日志记录、事务管理都是一个关注点
8 H/ H, V; F" c 在oop应用程序中,关注点可能已经被代码模块化了还可能散落在整个对象模型中
8 W1 d6 u E' ?" S' M* U/ c! n2、横切关注点(crosscutting concern)
' |' Y2 {" P8 R X9 a* n$ r5 ^ 一个关注点的实现代码散落在多个类中或方法中
: V8 j! R$ B+ W$ t. e6 [: p3、方面(aspect)/ s {* F8 v; {# F, ]1 C
一个方面是对一个横切关注点模块化,它将那些原本散落在各处的,
" s& K- V$ {! o$ W* b 用于实现这个关注点的代码规整在一处
* g* K/ k% N9 ~9 e2 p4、建议(通知)(advice)( m4 t% |- G- p9 c# f
advice是point cut执行代码,是方面执行的具体实现
/ g2 j4 X. \$ R( C4 j- e/ I 前置、后置、环绕、异常通知
' V3 ^- c! D* n5 I6 g- |; K5、切入点(pointcut) add*( [& y( a. E! G/ |
用于指定某个建议用到何处
) f! k3 G0 H) k4 ?6、织入(weaving)
- j( O. T8 g% b x [- O 将aspect(方面)运用到目标对象的过程$ a# ^) r" b; N: R8 w* X
7、连接点(join point)
: H+ P1 h- u6 \ 程序执行过程中的一个点* y# _. U- Q) C8 a" u9 l
5 |" w' w$ f% z' a
8、targetObject 目标对象
( z X9 _4 c: J( \/ a3 M& a! l! w9、proxyObject 代理对象
+ h4 n, z5 Z9 h& ?2 R& K% w) d* D
spring AOP主要是使用是动态代理机制
0 \; h1 c- [ l7 X& }# qspring AOP 完成日志输出
+ _' i0 a, z0 ^( t+ ` G 前置通知' L% {0 ]6 U+ c2 _0 f( F
(1)创建目标对象2 q5 ]% J* i9 J& l; q
(2)创建前置通知
/ @7 t- x: v4 O. U( |8 l 实现MethodBeforeAdvice; w" e! ]0 Y+ m
完成before处理
% ?4 q8 Z7 \# M& x/ Y (3)完成代理工厂类装配
4 E) [9 `/ B) G; g* j, r; U' z! o (a)代理类接口- c! w) ~* P% J" t) P& L" a6 I0 |
(b)通知
) [1 a {, u% U( q( ?* ^ (c)目标对象3 A" D) s& u6 L9 F: _
; \) h5 ~; U8 ^1 M$ ]( L+ B |
|