springboot的@Bean注解配置一个bean,方法的形式参数是另外一个bean的时(依赖注入)

直接上代码:

 /**
     * 直接模式队列1
     */
    @Bean
    public Queue directOneQueue() {
        return new Queue(RabbitConsts.DIRECT_MODE_QUEUE_ONE);
    }

    /**
     * 队列2
     */
    @Bean
    public Queue queueTwo() {
        return new Queue(RabbitConsts.QUEUE_TWO);
    }

    /**
     * 队列3
     */
    @Bean
    public Queue queueThree() {
        return new Queue(RabbitConsts.QUEUE_THREE);
    }

    /**
     * 分列模式队列
     */
    @Bean
    public FanoutExchange fanoutExchange() {
        return new FanoutExchange(RabbitConsts.FANOUT_MODE_QUEUE);
    }

    /**
     * 分列模式绑定队列1
     *
     * @param directOneQueue 绑定队列1
     * @param fanoutExchange 分列模式交换器
     */
    @Bean
    public Binding fanoutBinding1(Queue directOneQueue, FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(directOneQueue).to(fanoutExchange);
    }

    /**
     * 分列模式绑定队列2
     *
     * @param queueTwo       绑定队列2
     * @param fanoutExchange 分列模式交换器
     */
    @Bean
    public Binding fanoutBinding2(Queue queueTwo, FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(queueTwo).to(fanoutExchange);
    }

    /**
     * 主题模式队列
     * 
  • 路由格式必须以 . 分隔,比如 user.email 或者 user.aaa.email
  • *
  • 通配符 * ,代表一个占位符,或者说一个单词,比如路由为 user.*,那么 user.email 可以匹配,但是 user.aaa.email 就匹配不了
  • *
  • 通配符 # ,代表一个或多个占位符,或者说一个或多个单词,比如路由为 user.#,那么 user.email 可以匹配,user.aaa.email 也可以匹配
  • */ @Bean public TopicExchange topicExchange() { return new TopicExchange(RabbitConsts.TOPIC_MODE_QUEUE); } /** * 主题模式绑定分列模式 * * @param fanoutExchange 分列模式交换器 * @param topicExchange 主题模式交换器 */ @Bean public Binding topicBinding1(FanoutExchange fanoutExchange, TopicExchange topicExchange) { return BindingBuilder.bind(fanoutExchange).to(topicExchange).with(RabbitConsts.TOPIC_ROUTING_KEY_ONE); } /** * 主题模式绑定队列2 * * @param queueTwo 队列2 * @param topicExchange 主题模式交换器 */ @Bean public Binding topicBinding2(Queue queueTwo, TopicExchange topicExchange) { return BindingBuilder.bind(queueTwo).to(topicExchange).with(RabbitConsts.TOPIC_ROUTING_KEY_TWO); } /** * 主题模式绑定队列3 * * @param queueThree 队列3 * @param topicExchange 主题模式交换器 */ @Bean public Binding topicBinding3(Queue queueThree, TopicExchange topicExchange) { return BindingBuilder.bind(queueThree).to(topicExchange).with(RabbitConsts.TOPIC_ROUTING_KEY_THREE); }

    解释说明:这是一个@Configration的配置类里面配置的是自定义的bean.

    • 首先配置了三个无参数的Queue类型的bean:

    directOneQueue,  queueTwo, queueThree

    • 在其他的bean的方法中用到了该Queue的bean(依赖传递,依赖注入)

    如fanoutBinding2注入了queueTwo,此时方法的形式参数并不是只是一个变量,spring先根据Queue默认去找此类型的bean,发现存在上述的三个bean,接着就按照指定的bean的名字queueTwo查找,找到一个bean,就是用queueTwo这个bean,做为依赖传递给fanoutBinding2

    • 如果根据方法的形式参数找不到bean,那么就会更据参数类型去查找,结果找到三个,此时spring会报错,当然配置多个同名的bean同样会报错

    • 报错信息如下:

    Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.amqp.core.Queue' available: expected single matching bean but found 4: directOneQueue,queueTwo,queueThree,delayQueue
    	at org.springframework.beans.factory.config.DependencyDescriptor.resolveNotUnique(DependencyDescriptor.java:217)
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1217)
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1166)
    	at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:855)
    	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:758)
    	... 42 more

     

     

     
     

    你可能感兴趣的:(springboot)