Aop使用args切点的一个错误:No visible constructors in class *

mac2024-11-07  57

springAop使用args切点的一个错误:No visible constructors in class org.springframework.boot.context.properties.ConversionServiceDeducer$Factory

问题:

在使用args形式的aop的时候,程序跑不起来,报错如上,我当时的代码大概是这么写的

@Aspect @Component public class MyAspect { @Pointcut("args(java.lang.String)") public void pointCut() {} @Before("pointCut()") public void beforeSay() { System.out.println("说话之前做点准备。。。。"); } } @Service public class HelloServiceImpl implements HelloService, CommandLineRunner { @Autowired private HelloService helloService; @Override public void run(String... args) throws Exception { // 预期是这里执行say方法之前,执行切面类中beforeSay方法中的内容 helloService.say("你好明天"); } @Override public void say(String word) { System.out.println("我说:" + word); } }

实际上,@Pointcut(“args(java.lang.String)”) 这个切点表达式出大问题了。 凡是参数是一个String的方法都会被去增强,想想整个项目中、包括整个spring框架中,不知道有多少这样的方法呢,凡是加载到容器中的类都会被匹配一遍,还不知道会有多少问题呢。

正确的做法:

对这种匹配太模糊的切点,增加其他范围限制。比如

@Pointcut("execution(* com.su.demo.aspect.HelloService.*(..)) && args(java.lang.String)")

这样子就限定了只匹配com.su.demo.aspect.HelloService 这个类中的只有一个String类型参数的方法了。程序可以正常运行。

最新回复(0)