spring注入失败分析

问题阐述:

   spring注入失败分析_第1张图片

自动注入以实现类方式注入,启动报错:

 nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.dimeng.p2p.common.repayment.service.RepaymentServiceImpl] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

问题分析:

  SpringAop动态代理引起的

  1)默认情况下,Spring使用基于接口的代理

     a)如果Bean类有实现接口,那么Spring自动使用基于接口的代理创建Bean的代理实例

     b)如果Bean类没有实现接口,那么则使用基于子类扩展的动态代理(即CGLib代理)

解决办法:

       <aop:config proxy-target-class="true">  (其中一种)

关于动态代理的Demo

   1.定义一个Subject接口

   spring注入失败分析_第2张图片

2.接口的实现类

  spring注入失败分析_第3张图片

3.定义动态代理类

spring注入失败分析_第4张图片

 4.Client类  spring注入失败分析_第5张图片

结果展示:

spring注入失败分析_第6张图片

(1)InvocationHandler(接口)
每个代理类的实例都关联到一个handler
代理对象调用方法 ---> 转发为由InvocationHandler这个接口的invoke方法进行调用
(2)Proxy(类)
动态的创建一个代理对象的类
Proxy.newProxyInstance
第二个参数:给代理对象提供接口 --->代理对象实现这个接口 -->代理可以强转成接口类型
代理对象是在JVM运行时动态产生的一个对象,并不是InvocationHandler类型,也不是自定义接口的类型

参考文章:http://www.iteye.com/topic/1131444

                 https://blog.csdn.net/bingogirl/article/details/52304094


你可能感兴趣的:(spring)