背景

最近无意中去用Spring的切面写一些东西的时候,在测试时发现总是会被执行2次。看到网上有说@Commpent

重复的,或者在配置里多写了,总之是重复了,让容器帮你产生了2个代理,所以执行了2次。这是最常见的情况,为什么写这个文章呢?是因为下面的这种情况比较恶心,直接上代码!

代码

自定义的切面类什么注解也没用

public class DataSourceAspect {
    public void before(){
        System.out.println("before...");
    }
}

很简单的一个类,基本不存在什么多写注解然后被扫描到生成2次的情况。

配置

<!--自定义切面类-->
	<bean class="com.tb121.ssm.aspect.DataSourceAspect" id="myAspect"></bean>
	<aop:config>
		<!--execution(* com.a121tongbu..*.facade..*(..)))-->
		<!--execution(* com.a121tongbu..*.facade..*(..)))-->
		<aop:pointcut id="txPointcut" expression="(execution(* com.tb121.ssm.service.impl..*.*(..)))"/>
		<aop:aspect ref="myAspect" >
			<aop:before method="before" pointcut-ref="txPointcut"></aop:before>
		</aop:aspect>
	</aop:config>

调用的测试类

public class TestAspect extends TestBaseJunit {
    @Resource
    private PersonService personService;

    @Resource
    private TestAspService testAspService;
   
    @Test
    public void fun2() {
        personService.insert();
    }

}

结果

在这里插入图片描述

调试了很久之后,感觉都挑不出毛病,但最后结果都是before before两次,最后实在没办法,最后一次希望,不用这个测试的,把整个项目跑起来,直接访问试试看。

随后简单写了一个controller,然后访问。

在这里插入图片描述

结果!!!!好了!!!!我一口老血差点吐在电脑上,不过问题还是解决了,希望遇到这种情况,大家能把这种情况也考虑进去试一下。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐