Aop 面向切面、面向方面、面向接口1 ~1 S- b3 u& _! q3 P
程序中涉及到公共问题,集中解决" A1 M' U2 i0 O- [/ X+ G spring Aop中使用就动态代理. R& H" N' |2 u0 l) X
1、实现InvocationHandler( X, K: l$ Y9 l. x6 W$ b& ?* m2 Z4 L ?
2、生成代理对象1 J7 }/ Y# [. E" R0 H
Proxy.newProxyInstance(objectTarget.getClass().getClassLoader(), . T3 R0 m5 w6 c% N, z objectTarget.getClass().getInterfaces(), G$ O% O2 ]$ C) U o this) 3 d( I0 V! [0 V7 b/ m6 Y 3、编写invoke方法 - M4 q* A, [- D$ `7 T; b 执行newProxy自动执行invoke. r' G, d8 T/ y4 ~( J) Y
7 {* H2 _" k5 a. L0 K% n
Z! y" L, R8 i1 t dAOP相关概念 - y* G. g- m6 Z4 ]% d" I
1、关注点(concern) 6 c5 g O* o* \& i% @! @ 一个关注点可以是一个特定的问题,概念、或者应用程序的兴趣点。总而言之,应用程序必须达到一个目标, Q0 \0 k4 Z% F7 s, ]* v) [2 I
安全验证、日志记录、事务管理都是一个关注点0 ^$ M& V1 h {8 M2 X/ I3 _
在oop应用程序中,关注点可能已经被代码模块化了还可能散落在整个对象模型中, X K+ K+ v V, Q; P* R+ B
2、横切关注点(crosscutting concern) * K# |, Y# S2 p+ n( V 一个关注点的实现代码散落在多个类中或方法中8 y5 Q& A( j9 [
3、方面(aspect)* k# L0 d a5 ?; k
一个方面是对一个横切关注点模块化,它将那些原本散落在各处的, 2 P# v# m. C/ R% p9 | 用于实现这个关注点的代码规整在一处 9 c* m- r( t* h+ F8 s4、建议(通知)(advice)& N% F& E( a. u7 r; A' `, f
advice是point cut执行代码,是方面执行的具体实现, \' i8 c! \/ r% G; s- |
前置、后置、环绕、异常通知: P6 G& @. h; Y
5、切入点(pointcut) add*$ n/ H" |. F7 L$ k0 A8 ~
用于指定某个建议用到何处 # b6 B& `" R: ^! z6 {6、织入(weaving) 5 {: ~. }* H2 ? 将aspect(方面)运用到目标对象的过程. V7 {) L* b5 U; q! N7 r: v+ Z1 _
7、连接点(join point) % Q) U6 E# z8 n$ I4 Z8 K6 s/ m 程序执行过程中的一个点 $ }1 g) c# {5 o* o t : u. m/ k" F0 L+ P+ S8、targetObject 目标对象 T) a3 T6 s- A( o9、proxyObject 代理对象 7 s8 Z+ G. e' S0 z0 h1 O8 U8 V3 K% n4 m6 I( J+ f' i5 u( c5 G
spring AOP主要是使用是动态代理机制 6 I y# B5 }. Z$ e/ f! zspring AOP 完成日志输出; k6 ?! h1 n+ L) `: V3 h* u3 H2 Q
前置通知9 H$ I& R% T# w& u1 z- f% y
(1)创建目标对象+ t* X4 Z, G& J# a* D8 z
(2)创建前置通知 3 P- W+ B4 ^( v3 P' { 实现MethodBeforeAdvice( b1 F/ }" W, z) r
完成before处理 v) n( K* k0 o+ z (3)完成代理工厂类装配7 t9 k; M# L$ t$ R+ {4 Q# _
(a)代理类接口 3 S1 P2 F4 l& R" T (b)通知, _: |% L. M5 Y. I+ _+ \2 i
(c)目标对象 ; M; ]* N2 z9 h7 d8 {$ R4 x: n1 l: E7 @ ! g, R6 B. x2 K5 a0 W6 B1 E