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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章