AOP概念及实践
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

AOP概念及实践

  • 2,000 views
Uploaded on

AOP概念及实践

AOP概念及实践

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
2,000
On Slideshare
2,000
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
33
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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