spring框架下的AOP(基础代码分析)

使用spring框架下的AOP

由于spring框架对AOP进行了封装,所以可以用面向对象的方法实现AOP。

只需要创建一个切面对象,将所有的非业务信息放进去即可。

代码分析

@Aspect
@Component
public class LoggerAspect {
    @Before("execution(public int com.woongcha.utils.impl.CalImpl.*(..))")
    public void before(JoinPoint joinPoint){
        String name=joinPoint.getSignature().getName();
        String args= Arrays.toString(joinPoint.getArgs());
        System.out.println(name+"方法的参数是:"+args);
    }
    @After("execution(public int com.woongcha.utils.impl.CalImpl.*(..))")
    public void after(JoinPoint joinPoint){
        String name=joinPoint.getSignature().getName();
        System.out.println(name+"方法执行完毕");
    }
    @AfterReturning(value = "execution(public int com.woongcha.utils.impl.CalImpl.*(..))",returning = "result")
    public void afterReturning(JoinPoint joinPoint,Object result){
        String name=joinPoint.getSignature().getName();
        System.out.println("结果是:"+result);

    }
    @AfterThrowing(value ="execution(public int com.woongcha.utils.impl.CalImpl.*(..))",throwing = "exception")
    public  void afterThrowing(JoinPoint joinPoint,Object exception){
        String name=joinPoint.getSignature().getName();
        System.out.println(name+"异常抛出"+exception);
    }
}

@Component

为了让IoC容器获取到这个切面类中的方法。

@Aspect

表示这个类是切面类,使之成为切面对象。

@Before()

是指在业务代码执行之前运行的代码块,()内添加所要切入的方法。

@After()

是指在业务代码执行之后运行的代码块,()内添加所要切入的方法。

@AfterReturning

是指在业务代码执行之后返回的结果,()内添加所要切入的方法以及接收到的结果。

@AfterThrowing

是指在业务代码执行之后产生的异常,()内添加所要切入的方法以及接收到的异常。

@AfterThrowing
“execution(public int com.woongcha.utils.impl.CalImpl.*(…))”

通过execution表达式找到具体的方法

*表示在这个包下的所有方法

*(…) …表示传入的参数

JoinPoint joinPoint

通过连接点传入业务方法的相关信息。

String name=joinPoint.getSignature().getName();

getSignature()…getName()获取业务方法的方法名。

String args= Arrays.toString(joinPoint.getArgs());

joinPoint.getArgs()拿到是Object类型的数组,转成String类型。

spring.xml中配置AOP

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:p="http://www.springframework.org/schema/aop" xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <context:component-scan base-package="com.woongcha"></context:component-scan>
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

</beans>
context:component-scan

扫描com.woongcha包下的所有@Component注解,有@Component注解的自动添加到IoC容器中。
CalImpl也需添加@Component注解,也由IoC容器管理。

aop:aspectj-autoproxy

使@ASpect注解生效,让目标类和切面类结合自动生成动态代理对象。

解释

  • 切面:横切关注点被模块化的抽象对象。
  • 通知:切面对象完成的工作。
  • 目标:被通知的对象,即被横切的对象。
  • 代理:切面、通知、目标混合之后的对象。
  • 连接点:通知要插入业务代码的具体位置。
  • 切点:AOP 通过切点定位到连接点。
©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页