zoukankan      html  css  js  c++  java
  • 【记录】Field required a single bean, but 2 were found:

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

    错误信息:

    ***************************
    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自动注入策略。

  • 相关阅读:
    epoll精髓 C++ 技术中心 C++博客
    【找茬】split string 力为的技术博客 C++博客
    不谈技术~蛇年,我回来了!
    不说技术~希望所有人都好好的
    DDD~充血模型和失血模型
    基础才是重中之重~何为原子化操作
    DDD~概念中的DDD
    策略模式
    windows句柄和消息技术
    观察者模式2(observer)
  • 原文地址:https://www.cnblogs.com/the-fool/p/11054086.html
Copyright © 2011-2022 走看看