码迷,mamicode.com
首页 > 编程语言 > 详细

spring exception--No unique bean of type

时间:2015-05-21 21:59:19      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

今天碰到一个问题,就是我现有项目需要加一个定时器任务,我的代码如下:

Java代码 
  1. <!-- 每日数据同步 总数监测任务******************begin -->  
  2.   
  3.     <bean id="dataMonitorServiceImpl"  
  4.         class="com.netqin.function.dataMonitor.service.impl.DataMonitorServiceImpl">  
  5.     </bean>  
  6.     <bean id="scheduledDataMonitorDetail"  
  7.         class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
  8.         <property name="targetObject">  
  9.             <ref bean="dataMonitorServiceImpl" />  
  10.         </property>  
  11.         <property name="targetMethod">  
  12.             <value>autoMonitorSyncStatus</value>  
  13.         </property>  
  14.     </bean>  
  15.     <bean id="dataMonitorCronReportTrigger"  
  16.         class="org.springframework.scheduling.quartz.CronTriggerBean">  
  17.         <property name="jobDetail">  
  18.             <ref bean="scheduledDataMonitorDetail" />  
  19.         </property>  
  20.         <property name="cronExpression">  
  21.             <value>41 10 * * ?</value>  
  22.         </property>  
  23.     </bean>  
  24.     <!-- 每日数据同步 总数监测任务******************end -->  

这里我初始化了一个叫:dataMonitorServiceImpl的bean,这个bean是一个现有Service的实现类。

 

Java代码 
  1. @Service  
  2. public class DataMonitorServiceImpl implements IDataMonitorService {  
  3.     Logger logger = Logger.getLogger(DataMonitorServiceImpl.class);  
  4.     @Autowired  
  5.     private IBaseDao dao;  
  6.     @Autowired  
  7.     private IDasBaseDao dasDao;  

如上所示,我这里是用了注解@Service,spring会自动加载这个类,

 

因为上面我对这个bean有定义了一次,理论上来说会报错,因为同一个bean加载了两次,那么当向IDataMonitorService注入的时候就会发现有两个DataMonitorServiceImpl的bean,

但是我想想中的报错场景并没有发生,tomcat正常启动,我就很想知道为什么。

我把xml里面定义bean的名字改了一下,第一个字母改成大写,重启tomcat,ok,我看见了我想看见的错误:

Javascript代码 
  1. No unique bean of type [com.netqin.function.dataMonitor.service.IDataMonitorService] is defined: expected single matching bean but found 2: [dataMonitorServiceImpl, DataMonitorServiceImpl]  

很明显,后边那个bean是我在xml里面声明的,那么第一个就是我用annotation的@Service声明的,这就是说明

 

1. @Service在声明bean的时候如果不指定名称的话,会默认以类名的一个字母小写命名。

2. 当spring初始化bean时,会监测要初始化的bean是否已经存在相同名称的bean。

做出上面的两个结论之后,我又有了俩个疑问,

1. bean在初始化的时候,xml声明和annotation的声明初始化bean的先后顺序是怎么样的。

2. bean在监测是否有相同名称的bean的时候,是只检测名称一致性,还是说是在每个bean的类别下的名称一致性?

第一个问题的答案是这样的,他们的初始化的顺序是有你指定的xml所决定的,举个例子:

你在applicationcontext.xml(这里只是举例)里显示声明了annotation需要扫描的文件目录包括那些,然后接在在下面又声明了很多bean,这种情况就是先初始化annotation,在初始化xml生命的bean。

spring是依据你声明的顺序来初始化一切,spring会从最原始的spring的xml文件开始扫描,扫描一条处理一条,也可能你的spring又引用了很多别的xml配置,那也是一样的,看引入的先后顺序。

第二个问题我做了如下的实验,:

Java代码 
  1. <span style=""><bean id="dataMonitorServiceImpl"             
  2.         class="com.netqin.function.channel.service.impl.ChannelManagementServiceImpl">  
  3.     </bean>  
  4.     <!-- <bean id="dataMonitorServiceImpl"  
  5.         class="com.netqin.function.dataMonitor.service.impl.DataMonitorServiceImpl">  
  6.     </bean> --></span>  

原先的bean我注释掉了 我换了一个,但是bean名字没变,

 

 

Java代码 
  1. <span style="">public DataMonitorServiceImpl(){  
  2.         System.out.println("DataMonitorServiceImpl is loaded!");  
  3.     }</span>  

我给DataMonitorServiceImpl写了一个空的构造方法,已确定他是否已经被spring装载。

 

ok,看看tomcat说什么:

Java代码 
  1. <span style=""> No unique bean of type [com.netqin.function.dataMonitor.service.IDataMonitorService] is defined: Unsatisfied dependency of type [interface com.netqin.function.dataMonitor.service.IDataMonitorService]: expected at least 1 matching bean</span>  

spring说没有这个类型的bean被定义,这个类型的bean被期望的是最少有一个匹配的bean。

 

第二个问题的答案就是spring在初始化bean的时候是只保持名称的一致性,这个其实和xml里面声明bean的时候bean不能重复是一致的,多了annotation也不影响。

总结一下今天的结论:

 

1. @Service在声明bean的时候如果不指定名称的话,会默认以类名的一个字母小写命名。

2. 当spring初始化bean时,会监测要初始化的bean是否已经存在相同名称的bean。

3. spring初始化bean的顺序依赖于你在xml里面配置的顺序。

4.spring在初始化bean的时候是只保持名称的一致性。

spring exception--No unique bean of type

标签:

原文地址:http://www.cnblogs.com/duanxz/p/4520630.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!