在开发的过程中 写完了一个方法 想去测试一下对不对 然后直接在test类中注入了impl 实现类结果报了 com.sun.proxy.$Proxy92 异常,如图。
错误:直接注入了实现类
原因:
AOP的底层使用了动态代理,而我们使用的是基于JDK的动态代理,如果我们注入的是实现类(serviceImpl),而不是接口(service),这个与Spring的设计规范不符合。
AOP切入点为实现类(serviceImpl),实现类Impl实现接口中的方法,那么serviceImpl就是目标对象,service就是代理对象。
这里我们给Impl实现类加了@Autowired注解,并且调用了实现类中的方法,因此spring会使用注解反射对ServiceImpl进行操作。spring使用反射进行操作时,代理类与被代理类都是Service接口的实现类。新生成的代理类只能向上转型为接口类型,不能强转给同等级ServiceImpl。