乐趣区

关于java:Spring2AOP简介

Spring AOP 简介

1. 定义

AOP 是 Aspect Oriented Programming,即面向切面编程。

那什么是 AOP?

咱们先回顾一下 OOP:Object Oriented Programming,OOP 作为面向对象编程的模式,取得了微小的胜利,OOP 的次要性能是数据封装、继承和多态。

而 AOP 是一种新的编程形式,它和 OOP 不同,OOP 把零碎看作多个对象的交互,AOP 把零碎合成为不同的关注点,或者称之为切面(Aspect)。

AOP 在程序开发中次要用来解决一些零碎层面上的问题,比方日志,事务,权限期待,Struts2 的拦截器设计就是基于 AOP 的思维,是个比拟经典的例子。

2.AOP 原理

AOP 须要解决的问题是,如何把切面织入到外围逻辑中,如何对调用办法进行拦挡,并在拦挡前后进行安全检查、日志、事务等解决,就相当于实现了所有业务性能。

在 Java 平台上,对于 AOP 的织入,有 3 种形式:

  1. 编译期:在编译时,由编译器把切面调用编译进字节码,这种形式须要定义新的关键字并扩大编译器,AspectJ 就扩大了 Java 编译器,应用关键字 aspect 来实现织入;
  2. 类加载器:在指标类被装载到 JVM 时,通过一个非凡的类加载器,对指标类的字节码从新“加强”;
  3. 运行期:指标对象和切面都是一般 Java 类,通过 JVM 的动静代理性能或者第三方库实现运行期动静织入。

最简略的形式是第三种,Spring 的 AOP 实现就是基于 JVM 的动静代理。因为 JVM 的动静代理要求必须实现接口,如果一个一般类没有业务接口,就须要通过 CGLIB 或者 Javassist 这些第三方库实现。

AOP 技术看上去比拟神秘,但实际上,它实质就是一个动静代理,让咱们把一些罕用性能如权限查看、日志、事务等,从每个业务办法中剥离进去。

须要特地指出的是,AOP 对于解决特定问题,例如事务管理十分有用,这是因为扩散在各处的事务代码简直是完全相同的,并且它们须要的参数(JDBC 的 Connection)也是固定的。另一些特定问题,如日志,就不那么容易实现,因为日志尽管简略,但打印日志的时候,常常须要捕捉局部变量,如果应用 AOP 实现日志,咱们只能输入固定格局的日志,因而,应用 AOP 时,必须适宜特定的场景。

3. 语法

3.1 基本概念

  • Aspect:切面,即一个横跨多个外围逻辑的性能,或者称之为零碎关注点;
  • Joinpoint:连接点,即定义在利用程序流程的何处插入切面的执行;
  • Pointcut:切入点,即一组连接点的汇合;
  • Advice:加强,指特定连接点上执行的动作;
  • Introduction:引介,指为一个已有的 Java 对象动静地减少新的接口;
  • Weaving:织入,指将切面整合到程序的执行流程中;
  • Interceptor:拦截器,是一种实现加强的形式;
  • Target Object:指标对象,即真正执行业务的外围逻辑对象;
  • AOP Proxy:AOP 代理,是客户端持有的加强后的对象援用,Spring 中的 AOP 代理能够使 JDK 动静代理,也能够是 CGLIB 代理,前者基于接口,后者基于子类

3.2 告诉办法

  • 前置告诉(@Before)

    • 在指标办法被调用之前做加强解决,@Before 只须要指定切入点表达式即可
  • 后置告诉(@After)

    • 在指标办法实现之后做加强,无论指标办法时候胜利实现。@After 能够指定一个切入点表达式
  • 返回告诉(@AfterReturning)

    • 在指标办法失常实现后做加强,@AfterReturning 除了指定切入点表达式后,还能够指定一个返回值形参名 returning, 代表指标办法的返回值
  • 异样告诉(@AfterThrowing)

    • 次要用来处理程序中未解决的异样,@AfterThrowing 除了指定切入点表达式后,还能够指定一个 throwing 的返回值形参名, 能够通过该形参名来拜访指标办法中所抛出的异样对象
  • 盘绕告诉(@Around)

    • 盘绕告诉, 在指标办法实现前后做加强解决, 盘绕告诉是最重要的告诉类型, 像事务, 日志等都是盘绕告诉, 留神编程中外围是一个 ProceedingJoinPoint

3.3 启用形式

  1. xml 配置形式,在 applicationContext.xml 中配置上面一句:

    <aop:aspectj-autoproxy />
  2. 注解形式,在启动类上加上 @EnableAspectJAutoProxy

    @EnableAspectJAutoProxy
    @SpringBootApplication
    public class Application {public static void main(String[] args) {//do something}
    }

4. 实例

4.1 定义指标类

public class MathCalculator {public int div(int x, int y) {System.out.println(x / y);
        return x / y;
    }
}

4.2 定义切面类, 并指定告诉办法

@Aspect
public class LogAspects {@Pointcut("execution(int com.test.tornesol.util.spring.spring_aop.MathCalculator.div(int,int))")
    public void pointCut() {}

    @Before("com.test.tornesol.util.spring.spring_aop.LogAspects.pointCut()")
    public void logStart(JoinPoint joinPoint) {System.out.println(joinPoint.getSignature().getName() + "除法运行, 参数是:" + Arrays.asList(joinPoint.getArgs()));
    }

    @After("com.test.tornesol.util.spring.spring_aop.LogAspects.pointCut()")
    public void logEnd() {System.out.println("除法完结");
    }


    @AfterReturning(value = "com.test.tornesol.util.spring.spring_aop.LogAspects.pointCut())", returning = "result")
    public void logReturn2(JoinPoint joinPoint, Object result) {System.out.println(joinPoint.getSignature().getName() + "除法返回" + result);
    }

    @AfterThrowing(value = "com.test.tornesol.util.spring.spring_aop.LogAspects.pointCut()", throwing = "exception")
    public void logException(Exception exception) {System.out.println("除法异样");
    }
}

Notes:留神给切面类增加 @Aspect 注解

4.3 增加 Configuration 类,注入指标类和切面类,并开启 AOP 代理模式

@Configuration
@EnableAspectJAutoProxy// 开启基于注解的 AOP 模式
public class MainConfig {
    @Bean
    public MathCalculator mathCalculator() {return new MathCalculator();
    }
    @Bean
    public LogAspects logAspects() {return new LogAspects();
    }
}

4.4 测试 输入

public class AopDemo {static public void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class);
        context.getBean(MathCalculator.class).div(4, 2);
    }
}
div 除法运行, 参数是:[4, 2]
2
除法完结
div 除法返回 2 

5. 参考文档

  1. 应用 AOP – 廖雪峰的官方网站 (liaoxuefeng.com),廖雪峰的文档写的还不错,能够用来疾速理解上手 AOP。
  2. Aspect Oriented Programming With Spring,Spring 的官网文档最权威具体
退出移动版