springAOP的简单使用

springAOP的使用:

需要进行方法增强的类:

public class Log {
    //业务逻辑方法
    public int log(int i, int j) {
        System.out.println("业务逻辑方法-----------------");
        return i / j;
    }
}


新建我们的切面类:

//日志切面类
@Aspect
public class LogAspects {
    /**
     * pointCut :指定要增强的方法
     */
    @Pointcut("execution(public int com.enjoy.cap10.aop.Log.*(..))")
    public void pointCut(){}

    //执行业务逻辑方法前,要执行的方法
    @Before("pointCut()")
    public void logStart(JoinPoint joinPoint){
        System.out.println("除法运行之前...参数是:{"+ Arrays.asList(joinPoint.getArgs()) +"}");
    }

    //执行业务逻辑方法后,要执行的方法
    @After("pointCut()")
    public void logEnd(JoinPoint joinPoint){
        System.out.println(joinPoint.getSignature().getName()+" 除法运行结束...");
    }

    //执行业务逻辑方法后,要执行的方法
    @AfterReturning(value = "pointCut()",returning = "result")
    public void logReturn(Object result){
        System.out.println("除法正常运行结束...返回结果是:{"+result+"}");
    }

    //执行业务逻辑方法出现异常时,要执行的方法
    @AfterThrowing(value = "pointCut()",throwing = "exception")
    public void logThrow(Exception exception){
        System.out.print("除法运行异常...异常原因是:{"+exception+"}");
    }

    //环绕通知
    @Around("pointCut()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint){
        System.out.println("执行@Around目标方法之前....");
        Object proceed = null;
        try {
            proceed = proceedingJoinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        System.out.println("执行@Around目标方法之后....");
        return proceed;
    }
}

在这里插入代码片

配置我们的配置类,主要是把我们的切面类和日之类交给spring容器进行管理:

@Configuration
@EnableAspectJAutoProxy
public class Cap10MainConfig {
    @Bean
    public Log log(){
        return new Log();
    }
    @Bean
    public LogAspects logAspects(){
        return new LogAspects();
    }
}

引入我们的测试类:


public class Cap10Test {

    @Test
    public void Test(){
        AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(Cap10MainConfig.class);

        Log log = (Log) app.getBean("log");
        log.log(3,4);
        app.close();


    }
}

最后的测试结果:

"C:\Program Files\Java\jdk1.8.0_202\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:E:\javaSoft\idea\IntelliJ IDEA 2018.3.2\lib\idea_rt.jar=59999:E:\javaSoft\idea\IntelliJ IDEA 2018.3.2\bin" -Dfile.encoding=UTF-8 -classpath "E:\javaSoft\idea\IntelliJ IDEA 2018.3.2\lib\idea_rt.jar;E:\javaSoft\idea\IntelliJ IDEA 2018.3.2\plugins\junit\lib\junit-rt.jar;E:\javaSoft\idea\IntelliJ IDEA 2018.3.2\plugins\junit\lib\junit5-rt.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\rt.jar;F:\code\springPractice\target\test-classes;F:\code\springPractice\target\classes;E:\javaSoft\repository\org\springframework\spring-context\5.0.6.RELEASE\spring-context-5.0.6.RELEASE.jar;E:\javaSoft\repository\org\springframework\spring-aop\5.0.6.RELEASE\spring-aop-5.0.6.RELEASE.jar;E:\javaSoft\repository\org\springframework\spring-beans\5.0.6.RELEASE\spring-beans-5.0.6.RELEASE.jar;E:\javaSoft\repository\org\springframework\spring-core\5.0.6.RELEASE\spring-core-5.0.6.RELEASE.jar;E:\javaSoft\repository\org\springframework\spring-jcl\5.0.6.RELEASE\spring-jcl-5.0.6.RELEASE.jar;E:\javaSoft\repository\org\springframework\spring-expression\5.0.6.RELEASE\spring-expression-5.0.6.RELEASE.jar;E:\javaSoft\repository\org\springframework\spring-aspects\5.0.6.RELEASE\spring-aspects-5.0.6.RELEASE.jar;E:\javaSoft\repository\org\aspectj\aspectjweaver\1.8.13\aspectjweaver-1.8.13.jar;E:\javaSoft\repository\junit\junit\4.12\junit-4.12.jar;E:\javaSoft\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.enjoy.test.Cap10Test,Test
四月 27, 2020 8:28:01 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@12bc6874: startup date [Mon Apr 27 20:28:01 CST 2020]; root of context hierarchy
执行@Around目标方法之前....
除法运行之前...参数是:{[3, 4]}
业务逻辑方法-----------------
执行@Around目标方法之后....
log 除法运行结束...
除法正常运行结束...返回结果是:{0}
四月 27, 2020 8:28:02 下午 org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@12bc6874: startup date [Mon Apr 27 20:28:01 CST 2020]; root of context hierarchy

Process finished with exit code 0

几个重要的注解的解释:
@Aspect 表示为切面类,告诉spring容器我这个类是切面类
@EnableAspectJAutoProxy 开启基于注解的AOP模式
@Pointcut:指定我们要进行增强的方法
JoinPoint 可以获取到我们方法的一些信息,参数,方法名…
环绕通知方法中,需要我们传入参数ProceedingJoinPoint,必须我们手动执行
proceedingJoinPoint.proceed()方法,返回值为我们的方法返回值

需要注意的地方:
我们声明的切面类和我们要增强的类,都必须注入到spring容器中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值