重构遇到个小问题,记录下:

错误信息:

***************************
APPLICATION FAILED TO START
*************************** Description: Field xxxService in com.alibaba.xxx required a single bean, but 2 were found:

解决方法:

Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

代码案例:

import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component; /**
* 一个接口
*/
public interface DataTransferService {
Long transferData() throws Exception; } /**
* 实现类一
* 重要:添加@Primary标记为默认初始化的类
*/
@Component("dataTransferService")
@Primary
class DataTransferServiceImpl implements DataTransferService { @Override
public Long transferData() throws Exception {
return 0L;
}
} /**
*实现类二
*/
@Component("dataTransferServiceSync")
class DataTransferServiceSyncImpl implements DataTransferService { @Override
public Long transferData() throws Exception { return 0L;
}
}

使用方式:

/**
* 两种使用方式,已测试
*/
public class ActivityDemo {
/**方式一*/
@Autowired
@Qualifier("dataTransferService")
protected DataTransferService dataTransferService; @Autowired
@Qualifier("dataTransferServiceSync")
protected DataTransferService dataTransferServiceSync; /**方式二*/ // @Resource("dataTransferService")
// protected DataTransferService dataTransferService;
//
// @Resource("dataTransferServiceSync")
// protected DataTransferService dataTransferServiceSync;
}

注意:添加@Primary告诉spring初始化时使用哪个主要的实现类。

补充:https://baijiahao.baidu.com/s?id=1608114169828948852&wfr=spider&for=pc

@Autowired与@Resource的区别

(1)@Autowired

@Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。

@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。如下:

(2)@Resource

@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。

所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。

最新文章

  1. Atiti  attilax主要成果与解决方案与案例rsm版 v4
  2. 51nod1693 水群
  3. codeforces 664A Complicated GCD
  4. PHP面向对象(OOP)编程完全教程:10.__set(),__get(),__isset(),__unset()四个方法的应用
  5. IE常见的CSS的BUG(一)
  6. The first to Python
  7. 用sqlyog迁移mysql数据库
  8. Cloud9 on Docker镜像发送
  9. NIO中的易筋经
  10. python 多线程共享全局变量的问题
  11. HystrixCommand实战
  12. linux下ssh通过公钥登录服务器
  13. JMeter 扩展JMeter插件获取更多监听器
  14. 自主搭建CNN训练时遇到的问题
  15. Java Runtime.exec
  16. yum安装提示错误Thread/process failed: Thread died in Berkeley DB library
  17. IDEA MAVEN Failed to create a Maven project 'C:/gitProjects/mayProj/pom.xml' already exists in VFS
  18. fiddler无法抓取chrome解决方法
  19. java的==和equal的区别(一)
  20. Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法

热门文章

  1. 2-1 Consul简介
  2. Win32 Windows计划 十一年
  3. python下载图片(3)
  4. React HOC
  5. Android 百度地图 SDK v3.0.0 (四) 离线地图功能介绍
  6. centos 6 yum源记录,离线下载rpm包的办法
  7. VC++ 使用预编译头
  8. Win8 Metro(C#)数字图像处理--2.71Sigma平滑滤波器
  9. ADB 基础命令使用
  10. win32 htmlayout dom操作demo