java中BeanNotOfRequiredTypeException的问题解决(@Autowired和@Resource注解的不同)

 更新时间:2023年07月18日 10:19:01   作者:自知自省  
本文主要介绍了java中BeanNotOfRequiredTypeException的问题解决(@Autowired和@Resource注解的不同),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1. 错误信息

org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named ‘aisleService’ must be of type [com.gdie.whlocation.service.impl.AisleService], but was actually of type [$Proxy38]

2. 问题原因

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

3. @Autowired和@Resource注解的区别

1. 使用类注入:  

@Resource(name = "aisleService")  
private AisleService aisleService;  

2. 使用接口注入:  

@Resource(name = "aisleService")  
private IAisleService aisleService;  

代码1不能使用JDK的动态代理注入,原因是JDK的动态代理不支持类注入,只支持接口方式注入;

代码2可以使用JDK动态代理注入;

如果要使用代码1的方式,必须使用cglib代理;当然了推荐使用代码2的方式,基于接口编程的方式!

使用1的方式也是可以的,建议试一下@Autowired这个注解:

  • @Autowired这个注解和@Resource注解不同的是方法类型不同;
  • @Autowired是按类的类型注入的 ,是不用区分注入名字的;
  • @Resource是按照类的名字注入的,区分注入名字的大小写的写错了也会报BeanNotOfRequiredTypeException异常;

4. 关于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);     
    }     
}  

到此这篇关于java中BeanNotOfRequiredTypeException的问题解决(@Autowired和@Resource注解的不同)的文章就介绍到这了,更多相关java BeanNotOfRequiredTypeException内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java9学习系列之安装与jshell使用

    java9学习系列之安装与jshell使用

    2017年9月21日,千呼万唤始出来,Java9终于发布了。作为自己天天接触的“对象”,还是应该多花点心思去了解她。后续再进一步了解详细特性。下面这篇文章主要给大家介绍了关于java9学习系列之安装与jshell使用的相关资料,需要的朋友可以参考下。
    2017-09-09
  • jasypt dubbo配置密文存放使用详解

    jasypt dubbo配置密文存放使用详解

    这篇文章主要介绍了jasypt dubbo配置密文存放使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • IDEA去除掉代码中虚线、波浪线和下划线实线的方法

    IDEA去除掉代码中虚线、波浪线和下划线实线的方法

    初次安装使用IDEA,总是能看到导入代码后,出现很多的波浪线,下划线和虚线,这是IDEA给我们的一些提示和警告,但是有时候我们并不需要,反而会让人看着很不爽,这里简单记录一下自己的调整方法,供其他的小伙伴在使用的时候参考
    2024-09-09
  • java编程实现杨辉三角两种输出结果实例代码

    java编程实现杨辉三角两种输出结果实例代码

    这篇文章主要介绍了java编程实现杨辉三角两种输出结果实例代码,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Java字节流与基本数据类型的转换实例

    Java字节流与基本数据类型的转换实例

    本篇文章主要介绍了Java字节流与基本数据类型的转换实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • SpringBoot定制JSON响应数据的实现

    SpringBoot定制JSON响应数据的实现

    本文主要介绍了SpringBoot定制JSON响应数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • Java多线程教程之如何利用Future实现携带结果的任务

    Java多线程教程之如何利用Future实现携带结果的任务

    Callable与Future两功能是Java 5版本中加入的,这篇文章主要给大家介绍了关于Java多线程教程之如何利用Future实现携带结果任务的相关资料,需要的朋友可以参考下
    2021-12-12
  • Java泛型中<?>和<T>的区别浅析

    Java泛型中<?>和<T>的区别浅析

    <T>和<?>的区别 <T>是参数类型,常常用于泛型类或泛型方法的定义,下面这篇文章主要给大家介绍了关于Java泛型中<?>和<T>区别的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • Java单表实现评论回复功能(多种实现方式)

    Java单表实现评论回复功能(多种实现方式)

    这篇文章主要介绍了Java单表实现评论回复功能,大家都知道评论功能有多种实现方式,本文逐一给大家详细讲解,需要的朋友可以参考下
    2023-03-03
  • 通过实例了解java spring使用构造器注入的原因

    通过实例了解java spring使用构造器注入的原因

    这篇文章主要介绍了通过实例了解spring使用构造器注入的原因,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12

最新评论