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类型参数的方法了。程序可以正常运行。