Spring的AOP----从入门到精通(2)

本篇文章,结合上一个代码实例,来使用感受一下Spring的AOP真正的作用。

作为一个入门的小demo,这里我们使用的所有方法都不涉及传参问题。步骤可以分为如下: ① 将目标类和切面类(封装了通知方法的类)加入到IOC容器中。 ② 告诉Spring到底哪个是切面类。使用@Aspect注解。 ③ 告诉Spring,切面类里面的每一个方法,都是何时何地运行。 (1)将目标类和切面类加入到IOC容器中。

/*
首先创建一个接口,这也是jdk底层动态代理传入的接口值照应
*/
public interface Calculator {
          
   
    void add();
}
package com.cn.impl;
/*
实现接口
使用@Service注解,将这个类加入到容器中
*/
import com.cn.service.Calculator;
import org.springframework.stereotype.Service;

@Service
public class Calculatorimpl implements Calculator {
          
   
    public void add(){
          
   
        System.out.println("正在使用add方法");
    }
}
package com.cn.util;
/*
切面类,使用@Commponent注解,将这个类加入到容器中
*/
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class Logutils {
          
   

    @Before("execution(public void com.cn.service.Calculator.add())")
    public void beforerLog(){
          
   
        System.out.println("[前置通知]使用add方法完毕");
    }

    @After("execution(public void com.cn.service.Calculator.add())")
    public void afterLog(){
          
   
        System.out.println("[后置通知]使用add方法完毕");
    }

    @AfterReturning("execution(public void com.cn.service.Calculator.add())")
    public void returnLog(){
          
   
        System.out.println("[正常返回通知]使用add方法完毕");
    }

    @AfterThrowing("execution(public void com.cn.service.Calculator.add())")
    public void throwLog(){
          
   
        System.out.println("[异常通知]使用add方法完毕");
    }
}

(2) 告诉Spring到底哪个是切面类。使用@Aspect注解。 如上代码所示,在切面类中使用了@Aspect注解 (3)告诉Spring,切面类里面的每一个方法,都是何时何地运行。 分别使用了@Before、@After、@AfterReturning、@AfterThrowing,四个注解对应不同的时刻,使用表达式,绑定对应方法。 这时候在xml文件中开启ioc注解扫描和aop的切面代理即可

<!--开启IOC注解扫描-->
    <context:component-scan base-package="com.cn"></context:component-scan>
    <!--启动aop切面代理-->
    <aop:aspectj-autoproxy/>

运行结果如下

经验分享 程序员 微信小程序 职场和发展