Spring的aop相关内容,在学习中我是先使用的配置文件的方式配置切面和切入点。一开始没有任何问题,后来再使用注解的方式配置的时候就出大问题了。

如图“开始1”和“结束”字样都是我的切面方法中打印的,“正在添加”是目标方法打印的,也就是说我的切面方法执行了两次。

这下让我彻底蒙了,我查了所有配置都没有问题。

这是我的切面类

import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
/**
 * Util class
 *
 * @author xxx
 * @date 2021/11/21
 */
@Aspect
@Component
public class AopUtil {
    @Pointcut("execution(void cn.xxx.service.StudentService.insert())")
    public void pointcut(){}
    @Before("pointcut()")
    public void before(){
        System.out.println("开始1");
    }
    @After("pointcut()")
    public void after(){
        System.out.println("结束");
    }
}

这是我的目标类:

package cn.xxx.service;
import org.springframework.stereotype.Service;
@Service
public class StudentService {
    public void insert(){
        System.out.println("正在添加");
    }
    public void delete(){
        System.out.println("正在删除");
    }
}

这是我的配置文件

<!--自动扫描-->
    <context:component-scan base-package="cn.xxx"></context:component-scan>
    <!--自动扫描并生成代理对象-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    <!--将目标方法所在的类和切面类扔到ISO容器中-->
    <!--<bean class="cn.xxx.service.StudentService"></bean>-->
    <bean id="util" class="cn.xxx.util.AopUtil"></bean>
    <!--配置AOP-->
    <!--<aop:config>-->
        <!--<aop:pointcut id="pc" expression="execution(void cn.xxx.service.StudentService.insert())-->
         <!--or execution(void cn.xxx.service.StudentService.delete())"></aop:pointcut>-->
        <!--配置切面-->
        <!--<aop:aspect ref="util">-->
            <!--<aop:after method="after" pointcut-ref="pc"></aop:after>-->
            <!--<aop:before method="before" pointcut-ref="pc"></aop:before>-->
        <!--</aop:aspect>-->
    <!--</aop:config>-->

解决办法:

最后查询了许多地方才发现,我的配置文件里切面类有关的那个<bean>没有注释,spring实际加载了两遍切面类,所以方法执行了两遍。这个问题也是首次使用spring中出现的第一个问题,以此记录希望帮到大家。