Spring注解与扫描,NoUniqueBeanDefinitionException

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

@Component
public class LoadMessageJob{
 // code
}

是等效的。

@Component默认类名的第一个字母小写成为bean的id,最后两者都需要扫描包以生效,。这样才能在实现了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中发现了:。这说明已经使用xml形式定义过了,就不能再用Component。

我们做了尝试:写了两个相同的 ,程序正常。一个和Component就报错。

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

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

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




你可能感兴趣的:(Spring,JAVA,JAVA,spring,注解)