spring中可以使用注解機制,代替傳統的在xml中配置一個bean。
如
- <pre name="code" class="java">@Component
- public class LoadMessageJob{
- // code
- }
和<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,如果早些注意到這個也許就會發現是不是在其他地方多次定義了它。
以后就不要在這種問題上吃虧了。