Spring注解驱动开发--AOP功能测试

前言

  Spring的AOP指的是在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式【动态代理】。

AOP功能测试

①导入AOP模块

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>4.3.12.RELEASE</version>
        </dependency>

②定义逻辑组件和切面类

逻辑组件

在业务逻辑运行的时候将日志进行打印(方法之前、方法运行结束、方法出现异常,xxx)

public class MathCalculator {

    public int div(int i,int j){
        System.out.println("MathCalculator...div...");
        return i/j;
    }

}

切面类

切面类里面的方法需要动态感知MathCalculator.div运行到哪里然后执行;

/**
 * 切面类   必须告诉Spring哪个类是切面类(给切面类上加一个注解:@Aspect)
 * @Aspect: 告诉Spring当前类是一个切面类
 *
 */
@Aspect
public class LogAspects {

    //抽取公共的切入点表达式
    //1、本类引用 pointCut()
    //2、其他的切面引用 com.atneusoft.springboot.aop.LogAspects.pointCut()
    @Pointcut("execution(public int com.atneusoft.springboot.aop.MathCalculator.*(..))")
    public void pointCut(){};

    //@Before在目标方法之前切入;切入点表达式(指定在哪个方法切入)
    //给切面类的目标方法标注何时何地运行(通知注解@Before\@After\@AfterReturning\@AfterThrowing)    //前置通知(@Before):在目标方法(div)运行之前运行
    @Before("pointCut()")
    public void logStart(JoinPoint joinPoint){
        Object[] args = joinPoint.getArgs();
        System.out.println(""+joinPoint.getSignature().getName()+"运行。。。@Before:参数列表是:{"+Arrays.asList(args)+"}");
    }
      //后置通知(@After):在目标方法(div)运行结束之后运行(无论方法正常结束还是异常结束)
    @After("com.atneusoft.springboot.aop.LogAspects.pointCut()")
    public void logEnd(JoinPoint joinPoint){
        System.out.println(""+joinPoint.getSignature().getName()+"结束。。。@After");
    }

    //JoinPoint一定要出现在参数表的第一位   //返回通知(@AfterReturning):在目标方法(div)正常返回之后运行
    @AfterReturning(value="pointCut()",returning="result")
    public void logReturn(JoinPoint joinPoint,Object result){
        System.out.println(""+joinPoint.getSignature().getName()+"正常返回。。。@AfterReturning:运行结果:{"+result+"}");
    }
    //异常通知(@AfterThrowing):在目标方法(div)出现异常以后运行
    @AfterThrowing(value="pointCut()",throwing="exception")
    public void logException(JoinPoint joinPoint,Exception exception){
        System.out.println(""+joinPoint.getSignature().getName()+"异常。。。异常信息:{"+exception+"}");
    }

}

③将切面类和业务逻辑类(目标方法所在类)都加入到容器中,给配置类中加 @EnableAspectJAutoProxy 【开启基于注解的aop模式,与配置文件的以下形式相同

    <!-- 开启基于注解版的切面功能 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
@EnableAspectJAutoProxy
@Configuration
public class MainConfigOfAOP {

    //业务逻辑类加入容器中
    @Bean
    public MathCalculator calculator(){
        return new MathCalculator();
    }

    //切面类加入到容器中
    @Bean
    public LogAspects logAspects(){
        return new LogAspects();
    }
}

总结

三步:
     1)、将业务逻辑组件和切面类都加入到容器中;告诉Spring哪个是切面类(@Aspect)
          2)、在切面类上的每一个通知方法上标注通知注解,告诉Spring何时何地运行(切入点表达式)
          3)、开启基于注解的aop模式;@EnableAspectJAutoProxy

原文地址:https://www.cnblogs.com/tombky/p/12695008.html

时间: 2024-11-29 09:13:45

Spring注解驱动开发--AOP功能测试的相关文章

Spring注解驱动开发-AOP、Tx和Servlet3.0

1 AOP 1.1 什么是AOP? 在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式. 底层就是动态代理. 1.2 AOP的应用 步骤: ①定义一个目标类以及目标方法. ②定义一个切面类,以及前置通知.后置通知等,使用各自的注解将通知织入到目标方法上. ③将目标类和切面类注册到容器中. ④在切面类上标注@Aspect注解,来告诉Spring这是一个切面类. ⑤在配置类上加上@EnableAspectJAutoProxy开启AspectJ自动代理. 示例: MathCalcu

Spring注解驱动开发(一)--项目搭建

一. 前言 <Spring注解驱动开发>系列文章是基于Spring的4.3.11.RELEASE版本,通过注解的方式进行开发演示. 二. 项目搭建 1.依赖包引用 创建一个maven工程,引入相关的依赖包.我们以依赖最少的原则只引用spring-context和junit包. <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>s

Spring注解驱动开发(二)--组件注入

一.前言 上一篇我们搭建了一个简单的Spring项目,并简单的使用了 组件注册.这一篇中,我们来详细的讲解组件注入. 二.组件注入 1. @ComponentScan 在上一篇中,我们使用了@Configuration和@Bean实现了组件注入.但是如果需要注入的组件很多的情况下,每个组件都需要通过一个@Bean注解进行注入,这样就会很麻烦.所以Spring提供了@ComponentScan注解. @ComponentScan可以指定需要扫描的包,在这些包下,@Component注解标注的组件都

Spring注解驱动开发(四)-----aop、声明式事务

AOP 概念 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式:-----基于动态代理 一个aop示例 1.导入aop模块:Spring AOP:(spring-aspects)-----导入相关jar包 2.MathCalculator-----一个业务逻辑的类-----在业务逻辑运行的时候将日志进行打印(方法之前.方法运行结束.方法出现异常,xxx) package com.atguigu.aop; public class MathCalculator { publ

Spring注解驱动开发(五)-----扩展原理

扩展原理 1.BeanPostProcessor-----bean后置处理器,bean创建对象初始化前后进行拦截工作的 2.BeanFactoryPostProcessor-----beanFactory的后置处理器在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容:所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建. 注:首先spring容器会创建beanDefinition,此时bean并没有初始化. 示例: ExtConfi

Spring注解驱动开发(一)-----组件注册

注册bean xml方式 1.beans.xml-----很简单,里面注册了一个person bean <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xm

Spring注解驱动开发(六)-----spring容器创建【源码】

Spring容器的refresh()[创建刷新] 1.prepareRefresh()刷新前的预处理 1).initPropertySources()初始化一些属性设置;子类自定义个性化的属性设置方法: 2).getEnvironment().validateRequiredProperties();检验属性的合法等 3).earlyApplicationEvents= new LinkedHashSet<ApplicationEvent>();保存容器中的一些早期的事件: 2.obtainF

Spring注解驱动开发--属性赋值

前言 在实际开发当中,Spring中bean的属性直接赋值用的不是太多,整理这方面的资料,做一个小结,以备后续更深入的学习. 通过配置文件的方式 以配置文件的方式启动spring容器时,可以使用property标签的value给bean的属性赋值,赋值的形式有以下几种: <--通过context:property-placeholder将properties文件中的值加载的环境变量中(properties中的属性值最终是以环境变量的形式存储的)><context:property-pla

Spring注解驱动开发(七)-----servlet3.0、springmvc

ServletContainerInitializer Shared libraries(共享库) / runtimes pluggability(运行时插件能力) 1.Servlet容器启动会扫描,当前应用里面每一个jar包的 ServletContainerInitializer的实现2.提供ServletContainerInitializer的实现类: 必须绑定在,META-INF/services/javax.servlet.ServletContainerInitializer 文件