• Spring异常累计(1)Spring注解与扫描,NoUniqueBeanDefinitionException


    spring中可以使用注解机制,代替传统的在xml中配置一个bean。

    1. <pre name="code" class="java">@Component  
    2. public class LoadMessageJob{  
    3.  // code  
    4. }  

    和<bean id="loadMessageJob" class="com.yicong.kisp.LoadMessageJob" />是等效的。

    @Component默认类名的第一个字母小写成为bean的id,最后两者都需要扫描包以生效,<context:component- scan base-package="com.yicong.kisp.invoke">。这样才能在实现了 ApplicationContextAware的类中使用getBean("id")得到一个容器管理的实例。

    实现ApplicationContextAware接口要实现 setApplicationContext(ApplicationContext arg0)方法。该方法传入一个ApplicationContext 对象,从这个object可以得到spring中所有被扫描的bean。所以,两步必不可少

    1、@Component注解一个类或用定义

    2、扫描所在包


    补充一下:刚才大师和杨老遇到一个很艹蛋的问题,启动tocmat时一直在报

    org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.szkingdom.kisp.stock.MessageStockJob] is defined: expected single matching bean but found 2: com.szkingdom.kisp.stock.MessageStockJob#0,messageStockJob

    很纳闷,这个类已经打了@component,并且扫描了,怎么会获取不到?换了类名就可以,这更说明是名字的问题了。怀疑是其他包的同类名,发现 没有,那就更奇怪了。最后的最后,在一个xml中发现了:<bean id = "...." class="....." >。这说明已经使用xml形式定义过了,就不能再用Component。

    我们做了尝试:写了两个相同的 <bean id="...">,程序正常。一个<bean>和Component就报错。

    猜想:两个相同的 <bean id="...">会覆盖,取最后一个为准,但是<bean>和Component可能不是这样的机制了。Spring的启动和加载机制挺复杂的。

    其实一开始没有好好看异常的具体信息,只是在想为什么找不到,NoUniqueBean写得很清楚了,不是唯一的bean,如果早些注意到这个也许就会发现是不是在其他地方多次定义了它。

    以后就不要在这种问题上吃亏了。

  • 相关阅读:
    LED事件
    CSR8670按钮事件
    编译提示:warning: ISO C89 forbids mixed declarations and code
    C#使用Smtp,通过qqmail发送邮件
    编写VS的Snippet
    WPF的Clipboard.SetText()有问题
    HttpListenerRequest.ContentEncoding
    jQuery的Deferred对象教程
    visual studio如何修改c++项目的.net framework框架版本
    如何让Sqlite支持Entity Framework Code-First
  • 原文地址:https://www.cnblogs.com/shangxiaofei/p/6092960.html
Copyright © 2020-2023  润新知