Spring基于注解的Aop实战以及原理解析

一.添加依赖包

  

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.1.2.RELEASE</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>5.1.2.RELEASE</version>
    </dependency>

二.编写业务逻辑类

  这次业务逻辑类为一个计算功能的,简单起见只写了一个除法,理解思想就行...

  

public class Calculate {
    public int div(int a,int b){
        return a/b;
    }
}

三.编写切面类

  这里比较重要,有@Aspect标注为切面类以和业务类分开,还有切点表达式的编写,以及通知类型等标签的使用。

//切面类
    @Aspect

public class LogAspects {
    @Pointcut("execution (public int com.Aop.Main.Calculate.*(..))")
    public void pointCut(){}

    @Before(value = "pointCut()")
    public void logStart(){
        System.out.println("除法开始运行...{}");
    }
    @After(value = "pointCut()")
    public void logEnd(){
        System.out.println("除法结束...");
    }
    @AfterReturning(value = "pointCut()")
    public void logReturn(){
        System.out.println("除法正常返回...");
    }
    @AfterThrowing(value = "pointCut()")
    public void logThrowing(){
        System.out.println("除法异常...{}");
    }
}

四.AopConfig类

  这个类相当于以前的application.xml里面的beans标签,@Bean就相当于Bean标签啦。要注意的一点是@EnableAspestJAutoProxy,这个是代替了以前的xml文件配置的<aop:aspect-autoproxy>启动注解式事务

  

@EnableAspectJAutoProxy
@Configuration
public class AopConfig {

    @Bean
    public Calculate calculate(){
        return new Calculate();
    }

    @Bean
    public LogAspects logAspects(){
        return new LogAspects();
    }

}

五.测试

public class AopMainTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext configApplicationContext = new AnnotationConfigApplicationContext();
        configApplicationContext.register(AopConfig.class);
        configApplicationContext.refresh();
        Calculate c = configApplicationContext.getBean(Calculate.class);
        c.div(1,2);
        configApplicationContext.close();
    }
}

结果如下:

猜你喜欢

转载自www.cnblogs.com/JimmyFanHome/p/10001447.html