AOP 概念及实践 By  李学科
AOP 术语 <ul><li>定义: AOP 是 OOP 的延续,是( Aspect Oriented Programming )的缩写,意思是面向切面编程。  </li></ul><ul><li>连接点 (Joinpoint) </li></...
AOP 术语 <ul><li>目标 (Target) </li></ul><ul><ul><li>切入的逻辑植入的目标类 </li></ul></ul><ul><li>引入 (Introduction) </li></ul><ul><ul><l...
第三方 AOP 组件 <ul><li>AspectJ </li></ul><ul><ul><li>有自己的编译器和语法 </li></ul></ul><ul><li>AspectWerkz </li></ul><ul><li>以上两个项目组已经...
4 种  AOP  工具的语义概括
4 种  AOP  工具中的语法
AspectJ 例子 <ul><li>public aspect Foo {   pointcut someListOperation() : call(* List+.add(..));   pointcut userScope() : wi...
使用注释的等效代码 <ul><li>public class Foo {   @Pointcut(&quot;call(* java.util.List+.add(..))&quot;)   public void someListOperat...
Spring 的植入方式 <ul><li>JDK 动态代理 </li></ul><ul><ul><li>使用到的类: Proxy,InvocationHandler </li></ul></ul><ul><ul><li>只能对接口进行代理 </...
AOP Alliance & Spring AOP
前置处理 <ul><li>class  A  implements  MethodBeforeAdvice{ </li></ul><ul><ul><li>public   void  before(Method method, Object[]...
后置处理 <ul><li>class  B  implements  AfterReturningAdvice{ </li></ul><ul><ul><li>public   void  afterReturning(Object return...
环绕处理 <ul><li>class  C  implements  MethodInterceptor{ </li></ul><ul><ul><li>public  Object invoke(MethodInvocation arg0)  ...
Spring 与 AspectJ <ul><li>从 Spring2.0 开始 </li></ul><ul><ul><li>支持 @AspectJ 注解 , 依然是方法级 </li></ul></ul><ul><ul><li>无缝集成 Aspe...
就这么简单 <ul><li>编码 </li></ul><ul><li>@Aspect public class HelloFromAspectJ { @Before(“execution(* greetTo(..))&quot;) public...
通配符简要说明 <ul><li>*  匹配任意字符,但它只能匹配上下文中的一个元素;  </li></ul><ul><li>..  匹配任意字符,可以匹配上下文中的多个元素,但在表示类时,必须和 * 联合使用,而在表示入参时则单独使用; </l...
栗子 <ul><li>execution(public * *(..))  </li></ul><ul><li>execution(* *To(..))  </li></ul><ul><li>execution(* com.kaiqi.*(.....
匹配的问题
植入的顺序 <ul><li>使用注释时 </li></ul><ul><ul><li>如果通知在同一个切面类中声明,则依照通知在切面类中定义的顺序进行植入;  </li></ul></ul><ul><ul><li>如果通知位于不同的切面类中,且这...
一个典型的注释类 <ul><li>@Retention(RetentionPolicy. RUNTIME) </li></ul><ul><li>public @interface KillKeyWord1 { </li></ul><ul><ul...
注释的使用范围 <ul><li>SOURCE : 保留在程序源码里,如 Override 、  Suppress- Warnings </li></ul><ul><li>CLASS : 保留在编译好的 class 文件里面,但 JAVA 源码中...
注释中的属性 <ul><li>只能用 public 或默认 (default) 这两个访问权修饰 </li></ul><ul><li>参数成员只能用基本类型 byte , short , char , int , long , float , ...
反射的效率 运算次数 1000 10000 100000 百万 千万 f.set 16 31 219 2172 21625 setProperty 359 406 625 2953 26438 差值百分比 2143.75% 1209.68% 1...
反射机制的盲点 <ul><li>无法直接访问继承到的属性,即使是 public 的 </li></ul><ul><li>私有的变量不再私有 </li></ul><ul><li>性能开销 </li></ul>
Upcoming SlideShare
Loading in...5
×

AOP概念及实践

1,743

Published on

AOP概念及实践

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,743
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
35
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

AOP概念及实践

  1. 1. AOP 概念及实践 By 李学科
  2. 2. AOP 术语 <ul><li>定义: AOP 是 OOP 的延续,是( Aspect Oriented Programming )的缩写,意思是面向切面编程。 </li></ul><ul><li>连接点 (Joinpoint) </li></ul><ul><ul><li>程序执行的某个特定位置,如类的初始化前后、方法的调用前后、抛异常后。 Spring 只支持方法连接点。 </li></ul></ul><ul><li>切点 (Pointcut) </li></ul><ul><ul><li>经过筛选后的连接点,连接点和切点可以理解为数据库中的记录与 SQL 之间的关系。 Spring 中通过 org.springframework.aop.Pointcut 进行描述 </li></ul></ul><ul><li>通知与处理 (Advice) </li></ul><ul><ul><li>植入到目标连接点上的一段程序。 Spring 提供的接口都带有方位名: BeforeAdvice,AfterReturnAdvice,ThrowsAdvice 。 </li></ul></ul>
  3. 3. AOP 术语 <ul><li>目标 (Target) </li></ul><ul><ul><li>切入的逻辑植入的目标类 </li></ul></ul><ul><li>引入 (Introduction) </li></ul><ul><ul><li>一种特殊的 Advice ,可以为类添加一些属性和方法 </li></ul></ul><ul><li>植入 (Weaving) </li></ul><ul><ul><li>将 Advice 与连接点结合的方法 .Spring 使用动态代理实现, AspectJ 在编译时和类加载时实现。 </li></ul></ul><ul><li>切面 (Aspect) </li></ul><ul><ul><li>Pointcut+Advice </li></ul></ul>
  4. 4. 第三方 AOP 组件 <ul><li>AspectJ </li></ul><ul><ul><li>有自己的编译器和语法 </li></ul></ul><ul><li>AspectWerkz </li></ul><ul><li>以上两个项目组已经合并 </li></ul><ul><li>Jboss AOP </li></ul><ul><li>Spring AOP </li></ul>
  5. 5. 4 种 AOP 工具的语义概括
  6. 6. 4 种 AOP 工具中的语法
  7. 7. AspectJ 例子 <ul><li>public aspect Foo {   pointcut someListOperation() : call(* List+.add(..));   pointcut userScope() : within(com.biz..*);   before() : someListOperation() && userScope(){     System.out.println();   } </li></ul><ul><li>} </li></ul>
  8. 8. 使用注释的等效代码 <ul><li>public class Foo {   @Pointcut(&quot;call(* java.util.List+.add(..))&quot;)   public void someListOperation() {}   @Pointcut(&quot;within(com.biz..*)&quot;)   public void userScope() {}   @Before(&quot;someListOperation() && userScope()&quot;)   public void before(JoinPoint thisJoinPoint) {     System.out.println(&quot;called: &quot;         + thisJoinPoint.getSignature()     );   } </li></ul><ul><li>} </li></ul>
  9. 9. Spring 的植入方式 <ul><li>JDK 动态代理 </li></ul><ul><ul><li>使用到的类: Proxy,InvocationHandler </li></ul></ul><ul><ul><li>只能对接口进行代理 </li></ul></ul><ul><li>CGLib 动态代理 </li></ul><ul><ul><li>使用到的类: MethodInterceptor,Enhancer, MethodProxy </li></ul></ul><ul><ul><li>对 Class 进行代理 </li></ul></ul>
  10. 10. AOP Alliance & Spring AOP
  11. 11. 前置处理 <ul><li>class A implements MethodBeforeAdvice{ </li></ul><ul><ul><li>public void before(Method method, Object[] args, Object target) throws Throwable { </li></ul></ul><ul><ul><li>// TODO Auto-generated method stub </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>} </li></ul>
  12. 12. 后置处理 <ul><li>class B implements AfterReturningAdvice{ </li></ul><ul><ul><li>public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { </li></ul></ul><ul><ul><li>// TODO Auto-generated method stub </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>} </li></ul>
  13. 13. 环绕处理 <ul><li>class C implements MethodInterceptor{ </li></ul><ul><ul><li>public Object invoke(MethodInvocation arg0) throws Throwable { </li></ul></ul><ul><ul><li>// TODO Auto-generated method stub </li></ul></ul><ul><ul><li>return null ; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>} </li></ul>
  14. 14. Spring 与 AspectJ <ul><li>从 Spring2.0 开始 </li></ul><ul><ul><li>支持 @AspectJ 注解 , 依然是方法级 </li></ul></ul><ul><ul><li>无缝集成 AspectJ </li></ul></ul><ul><ul><li>基于 Schema 的配置支持 , 提供了 aop 命名空间 </li></ul></ul><ul><li>依赖的类库 </li></ul><ul><ul><li>asm-2.2.2.jar,asm-commons-2.2.2.jar,asm-util-2.2.2.jar. </li></ul></ul><ul><ul><li>aspectjrt.jar,aspectjweaver.jar </li></ul></ul>
  15. 15. 就这么简单 <ul><li>编码 </li></ul><ul><li>@Aspect public class HelloFromAspectJ { @Before(“execution(* greetTo(..))&quot;) public void sayHello() { System.out.println(&quot;Hello from AspectJ !&quot;); } } </li></ul><ul><li>配置 </li></ul><ul><ul><li><aop:aspectj-autoproxy> </li></ul></ul>
  16. 16. 通配符简要说明 <ul><li>* 匹配任意字符,但它只能匹配上下文中的一个元素; </li></ul><ul><li>.. 匹配任意字符,可以匹配上下文中的多个元素,但在表示类时,必须和 * 联合使用,而在表示入参时则单独使用; </li></ul><ul><li>+ 表示按类型匹配指定类的所有类,仅能跟在类名后面。 </li></ul>
  17. 17. 栗子 <ul><li>execution(public * *(..)) </li></ul><ul><li>execution(* *To(..)) </li></ul><ul><li>execution(* com.kaiqi.*(..)) </li></ul><ul><li>execution(* joke(String,int))) </li></ul>
  18. 18. 匹配的问题
  19. 19. 植入的顺序 <ul><li>使用注释时 </li></ul><ul><ul><li>如果通知在同一个切面类中声明,则依照通知在切面类中定义的顺序进行植入; </li></ul></ul><ul><ul><li>如果通知位于不同的切面类中,且这些切面类都实现了相同接口,则由接口方法的顺序号决定; </li></ul></ul><ul><ul><li>如果通知位于不同的切面类中,且这些切面类没有实现相同接口,植入的顺序是不确定的。 </li></ul></ul><ul><li>使用配置文件时 </li></ul><ul><ul><li>与注释加载的规则类似 </li></ul></ul>
  20. 20. 一个典型的注释类 <ul><li>@Retention(RetentionPolicy. RUNTIME) </li></ul><ul><li>public @interface KillKeyWord1 { </li></ul><ul><ul><li>public String pro1 (); </li></ul></ul><ul><ul><li>String pro2 () default &quot;&quot;; </li></ul></ul><ul><li>} </li></ul>
  21. 21. 注释的使用范围 <ul><li>SOURCE : 保留在程序源码里,如 Override 、 Suppress- Warnings </li></ul><ul><li>CLASS : 保留在编译好的 class 文件里面,但 JAVA 源码中 未使用 </li></ul><ul><li>RUNTIME :在源码、 class 文件中保留信息,在执行的时候会把这些信息加载到 JVM 中去,如 Deprecated 、 Retention </li></ul>
  22. 22. 注释中的属性 <ul><li>只能用 public 或默认 (default) 这两个访问权修饰 </li></ul><ul><li>参数成员只能用基本类型 byte , short , char , int , long , float , double , boolean 八种基本数据类型和 String , Enum , Class </li></ul><ul><li>如果没有写属性名的值,如 @KillKeyWord(“txt&quot;) ,而这个注释又有 value 属性,就将这个值赋给 value 属性 </li></ul>
  23. 23. 反射的效率 运算次数 1000 10000 100000 百万 千万 f.set 16 31 219 2172 21625 setProperty 359 406 625 2953 26438 差值百分比 2143.75% 1209.68% 185.39% 35.96% 22.26% f.get 0 32 219 2172 21859 getProperty 16 15 156 1437 14500 差值百分比 100.00% -113.33% -40.38% -51.15% -50.75%
  24. 24. 反射机制的盲点 <ul><li>无法直接访问继承到的属性,即使是 public 的 </li></ul><ul><li>私有的变量不再私有 </li></ul><ul><li>性能开销 </li></ul>
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×