您的位置:首页 > 编程语言 > Java开发

org.springframework.beans.factory.BeanNotOfRequiredTypeException的解决办法

2016-10-13 00:00 706 查看
摘要: Spring Hibernate整合出现的问题:一般在使用annotation的方式注入spring的bean 出现的,具体是由于spring采用代理的机制导致的,看使用的代码。

Spring Hibernate整合出现的问题:一般在使用annotation的方式注入spring的bean 出现的,具体是由于spring采用代理的机制导致的,看使用的代码。

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.myssh.dao.impl.AccountDao] 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)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1103)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:963)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)
... 35 more

先看一段代码

1、基于接口注入方式(Spring推荐的方式)
@Autowired
private IUserDao userDao;

2、基于类注入的方式
@Autowired
private AccountDao accountDao;

默认情况下,代码2运行会报出文章开始的错误。

造成这种错误的原因是

jdk的动态代理不支持类注入,只支持接口方式注入;

如果要使用类方式的注入,必须使用cglib代理;

关于spring动态代理的配置:

1.使用aop配置:
<aop:config proxy-target-class="false"> </aop:config>

2. aspectj配置:
<aop:aspectj-autoproxy proxy-target-class="true"/>

3. 事务annotation配置:
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

上面3种配置,只要任选一种即可,将proxy-target-class设置为true即使用cglib的方式代理对象。

附:spring的aop代理判断逻辑:

//org.springframework.aop.framework.DefaultAopProxyFactory

//参数AdvisedSupport 是Spring AOP配置相关类

public AopProxy createAopProxy(AdvisedSupport advisedSupport)

throws AopConfigException {

//在此判断使用JDK动态代理还是CGLIB代理

if (advisedSupport.isOptimize() || advisedSupport.isProxyTargetClass()

|| hasNoUserSuppliedProxyInterfaces(advisedSupport)) {

if (!cglibAvailable) {

throw new AopConfigException(

"Cannot proxy target class because CGLIB2 is not available. "

+ "Add CGLIB to the class path or specify proxy interfaces.");

}

return CglibProxyFactory.createCglibProxy(advisedSupport);

} else {

return new JdkDynamicAopProxy(advisedSupport);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Spring 动态代理
相关文章推荐