Spring異常累計(1)Spring注解與掃描,NoUniqueBeanDefinitionException


spring中可以使用注解機制,代替傳統的在xml中配置一個bean。

[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
  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,如果早些注意到這個也許就會發現是不是在其他地方多次定義了它。

以后就不要在這種問題上吃虧了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM