aop操作-AspectJ注解方式

1.创建类,类中定义方法

package com.xxx.spring.aop.aopanno;

public class User {
    public void add(){
        System.out.println("add...");
    }
}

2.创建增强类(编写增强逻辑)

在增强类里面创建方法,让不同方法代表不同的通知类型

package com.xxx.spring.aop.aopanno;

//增强的类
public class UserProxy {

    //前置通知
    public void before(){
        System.out.println("before...");
    }
}

3.进行通知的配置

①在spring的配置文件中,开启注解扫描

②使用注解创建User和UserProxy对象

③在增强类上面添加@Aspect注解

④在spring的配置文件中开启生成代理对象

⑤配置不同类型的通知:在增强类中,在作为通知方法上面添加通知类型注解,使用切入点表达式配置内容

xml配置文件

<?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:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <context:component-scan base-package="com.xxx.spring.aop"></context:component-scan>

    <!--开启Aspect生成代理对象-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

 

UserProxy代理类

package com.xxx.spring.aop.aopanno;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

//增强的类
@Component
@Aspect
public class UserProxy {

    //前置通知
    @Before("execution(* com.xxx.spring.aop.aopanno.User.add(..))")
    public void before(){
        System.out.println("before...");
    }

    //后置通知,方法执行之后执行,最终通知,不管有没有异常都会执行
    @After("execution(* com.xxx.spring.aop.aopanno.User.add(..))")
    public void after(){
        System.out.println("after...");
    }

    //方法返回结果后执行
    @AfterReturning("execution(* com.xxx.spring.aop.aopanno.User.add(..))")
    public void afterReturning(){
        System.out.println("afterReturning...");
    }

    //异常通知
    @AfterThrowing("execution(* com.xxx.spring.aop.aopanno.User.add(..))")
    public void afterThrowing(){
        System.out.println("afterThrowing...");
    }

    //环绕通知
    @Around("execution(* com.xxx.spring.aop.aopanno.User.add(..))")
    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("环绕之前...");
        //执行被增强的方法
        proceedingJoinPoint.proceed();
        System.out.println("环绕之后...");
    }
}

 

被代理类User

package com.xxx.spring.aop.aopanno;

import org.springframework.stereotype.Component;

@Component
public class User {
    public void add(){
        System.out.println("被增强的方法add...");
    }
}

 

测试类

package com.xxx.spring.aop;

import com.xxx.spring.aop.aopanno.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestCae {

    @Test
    public void TestAopAnno(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        User user = context.getBean("user", User.class);
        user.add();

    }
}

 

1.没有异常时的执行结果顺序:

 

 

1.User类中添加异常,执行结果顺序:

 

 

 

 

 

抽取相同切入点

package com.xxx.spring.aop.aopanno;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

//增强的类
@Component
@Aspect
public class UserProxy {

    @Pointcut("execution(* com.xxx.spring.aop.aopanno.User.add(..))")
    public void pointUser(){

    }

    //前置通知
    @Before("pointUser()")
    public void before(){
        System.out.println("before...");
    }

    //后置通知,方法执行之后执行,最终通知,不管有没有异常都会执行
    @After("pointUser()")
    public void after(){
        System.out.println("after...");
    }

    //方法返回结果后执行
    @AfterReturning("pointUser()")
    public void afterReturning(){
        System.out.println("afterReturning...");
    }

    //异常通知
    @AfterThrowing("pointUser()")
    public void afterThrowing(){
        System.out.println("afterThrowing...");
    }

    //环绕通知
    @Around("pointUser()")
    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("环绕之前...");
        //执行被增强的方法
        proceedingJoinPoint.proceed();
        System.out.println("环绕之后...");
    }
}

 

 

注:使用完全注解方式

定义配置类,使用@EnableAspectJAutoProxy注解

@Configuration
@ComponentScan(basePackages = {"spring"})
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class MyConfig {
}

 

posted @ 2023-02-12 12:23  Mr_sven  阅读(25)  评论(0编辑  收藏  举报