spring exception--No unique bean of type
今天碰到一个问题,就是我现有项目需要加一个定时器任务,我的代码如下:
- <!-- 每日数据同步 总数监测任务******************begin -->
- <bean id="dataMonitorServiceImpl"
- class="com.netqin.function.dataMonitor.service.impl.DataMonitorServiceImpl">
- </bean>
- <bean id="scheduledDataMonitorDetail"
- class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
- <property name="targetObject">
- <ref bean="dataMonitorServiceImpl" />
- </property>
- <property name="targetMethod">
- <value>autoMonitorSyncStatus</value>
- </property>
- </bean>
- <bean id="dataMonitorCronReportTrigger"
- class="org.springframework.scheduling.quartz.CronTriggerBean">
- <property name="jobDetail">
- <ref bean="scheduledDataMonitorDetail" />
- </property>
- <property name="cronExpression">
- <value>0 41 10 * * ?</value>
- </property>
- </bean>
- <!-- 每日数据同步 总数监测任务******************end -->
这里我初始化了一个叫:dataMonitorServiceImpl的bean,这个bean是一个现有Service的实现类。
- @Service
- public class DataMonitorServiceImpl implements IDataMonitorService {
- Logger logger = Logger.getLogger(DataMonitorServiceImpl.class);
- @Autowired
- private IBaseDao dao;
- @Autowired
- private IDasBaseDao dasDao;
如上所示,我这里是用了注解@Service,spring会自动加载这个类,
因为上面我对这个bean有定义了一次,理论上来说会报错,因为同一个bean加载了两次,那么当向IDataMonitorService注入的时候就会发现有两个DataMonitorServiceImpl的bean,
但是我想想中的报错场景并没有发生,tomcat正常启动,我就很想知道为什么。
我把xml里面定义bean的名字改了一下,第一个字母改成大写,重启tomcat,ok,我看见了我想看见的错误:
- 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配置,那也是一样的,看引入的先后顺序。
第二个问题我做了如下的实验,:
- <span style=""><bean id="dataMonitorServiceImpl"
- class="com.netqin.function.channel.service.impl.ChannelManagementServiceImpl">
- </bean>
- <!-- <bean id="dataMonitorServiceImpl"
- class="com.netqin.function.dataMonitor.service.impl.DataMonitorServiceImpl">
- </bean> --></span>
原先的bean我注释掉了 我换了一个,但是bean名字没变,
- <span style="">public DataMonitorServiceImpl(){
- System.out.println("DataMonitorServiceImpl is loaded!");
- }</span>
我给DataMonitorServiceImpl写了一个空的构造方法,已确定他是否已经被spring装载。
ok,看看tomcat说什么:
- <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的更多相关文章
- Spring Error : No unique bean of type [org.apache.ibatis.session.SqlSessionFactory] is defined
报错信息: Injection of autowired dependencies failed; nested exception is org.springframework.beans.fa ...
- paip . 解决spring No unique bean of type [com.mijie.homi.search.service.index.MoodUserIndexService]
paip . 解决spring No unique bean of type [com.mijie.homi.search.service.index.MoodUserIndexService] ...
- Spring 定时器 No qualifying bean of type [org.springframework.scheduling.TaskScheduler] is defined
Spring 定时器 No qualifying bean of type [org.springframework.scheduling.TaskScheduler] is defined stac ...
- spring eureka required a bean of type 'com.netflix.discovery.DiscoveryClient' that could not be found.
spring在集成第三方过程很容易出现类名相同,且基本作用相同的类.这样给初学者带来一定的困惑. 导致用错类而出现以下问题. required a bean of type 'com.netflix. ...
- Spring 定时器 No qualifying bean of type [org.springframework.scheduling.TaskScheduler] is defined(转)
最近项目里面,用了spring的定时任务,一直以来,项目运行的不错.定时器也能正常使用.可是,今天启动项目测试的时候,盯着启动Log看了一阵子,突然间发现,启动的Log中居然有一个异常,虽然一闪而过, ...
- No unique bean of type..... Unsatisfied dependency of type
比如在XXXServiceImpl里面写了aa()方法给别的地方调用 但是自己又调用了自己 在开头写了 @Autowired Private XXX xxx; xxx.aa(); 这样重复调用自己的b ...
- No unique bean of type [net.shougongfang.action.paymoney.AlipayPayMoneyReturnObj] is defined: Unsat
0 你把@Service放到实现类上吧.这个问题好像不止一个人在问啦 2013年10月25日 10:34 shidan66 30 0 1 1 加入评论 00 1,@service放到实现上 2. ...
- Spring Task Scheduler - No qualifying bean of type [org.springframework.scheduling.TaskScheduler] is defined
1. Overview In this article, we are discussing the Springorg.springframework.beans.factory.NoSuchBea ...
- Spring Boot:Consider defining a bean of type '*.*.*' in your configuration解决方案
果然不看教程直接使用在遇到问题会懵逼,连解决问题都得搜半天还不一定能帮你解决了... ***************************APPLICATION FAILED TO START*** ...
随机推荐
- Hibernate从入门到精通(七)多对一单向关联映射
上次的博文Hibernate从入门到精通(六)一对一双向关联映射中我们介绍了一下一对一双向关联映射,本次博文我们讲解一下多对一关联映射 多对一单向关联映射 多对一关联映射与一对一关联映射类似,只是在多 ...
- String声明为NULL和""的区别
代码虐我千百遍,我待代码如初恋. String 声明为 NULL 则声明了一个变量不指向任何一块地址,则 length()会出现错误. 声明为"",则是一个长度为0的字符串.
- 山东省第四届ACM大学生程序设计竞赛解题报告(部分)
2013年"浪潮杯"山东省第四届ACM大学生程序设计竞赛排名:http://acm.upc.edu.cn/ranklist/ 一.第J题坑爹大水题,模拟一下就行了 J:Contes ...
- 1197: [HNOI2006]花仙子的魔法 - BZOJ
Description Input 包含两个整数,并用一个空格隔开,第一个整数表示实施魔法的次数m,第二个整数表示空间的维数n.其中,1≤m≤100,1≤n≤15. Output 仅包含一个整数,表示 ...
- mysql 跨库JOIN
现有两台MYSQL数据库 一台是192.168.1.1 端口3306 上有数据库DB1 有表TABLE1一台是192.168.1.2 端口3307 上有数据库DB2 有表TABLE2192.168.1 ...
- Extjs4 treePanel异步加载菜单(后台从数据库读取)
运行环境:springMVC+mybatis 一.建表 说明:0表示此节点为非叶子节点,即此节点还包括了子节点:1表示此节点为叶子节点,即此节点没有子节点.:关于图标iconCls是从Extjs的文件 ...
- 使用 Spark 进行微服务的实时性能分析
[编者按]当开发者从微服务架构获得敏捷时,观测整个系统的运行情况成为最大的痛点.在本文,IBM Research 展示了如何用 Spark 对微服务性能进行分析和统计,由 OneAPM 工程师编译整理 ...
- html10个特效(转载)
http://www.html5tricks.com/10-html5-jquery-image-animatin.html 现在网页上的图片已经不再是10几年前那种低像素的静态图片了,有了HTML5 ...
- linux为命令取别名
在linux的命令中,有些命令很长并且经常使用到,我们可以为命令添加一个别名,格式如下: $ alias 别名='命令' 例如: # 列出home文件夹的文件 $ alias lsh='ls -l / ...
- [博弈]ZOJ3591 Nim
题意: 给了一串数,个数不超过$10^5$,这串数是通过题目给的一段代码来生成的 int g = S; ; i<N; i++) { a[i] = g; ) { a[i] = g = W; } = ...