1. 命令参数的含义

问题:

rm -rf *.tar-rf 的含义是什么?

解答:

注意: rm -rf 是一个危险命令,尤其是搭配通配符(如 *)使用时,可能导致意外删除重要文件。


2. Docker 中为什么不需要指定 RabbitMQ 的 IP

问题:

很多 Docker 服务需要指定本机(虚拟机)的 IP,为什么 RabbitMQ 不需要?

解答:

RabbitMQ 服务运行在 Docker 容器内,可以通过以下方式实现网络通信:

  1. 端口映射:通过 -p 参数将容器端口映射到宿主机端口。例如:
    • -p 15672:15672:将 RabbitMQ 管理界面的端口 15672 映射到宿主机。
    • -p 5672:5672:将消息通信端口 5672 映射到宿主机。
  2. 网络模式:通过 --network 参数加入 Docker 自定义网络。例如 --network hm-net

RabbitMQ 的容器在启动后,只要其他服务与它处于同一网络(如 hm-net),即可通过容器名称(如 mq)直接访问,不需要显式指定宿主机的 IP 地址。


3. RabbitMQ 队列状态 idle 的含义

问题:

RabbitMQ 中队列状态 idle 是什么意思?

解答:

4. Spring 中 Fanout Exchange 的配置及 Bean 注入规则

配置代码:
@Configuration
public class FanoutConfiguration {
    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("hmall.fanout");
    }

    @Bean
    public Queue fanoutQueue1(){
        return new Queue("fanout.queue1");
    }

    @Bean
    public Binding fanoutQueue1Binding(Queue fanoutQueue1, FanoutExchange fanoutExchange){
        return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);
    }

    @Bean
    public Queue fanoutQueue2(){
        return new Queue("fanout.queue2");
    }

    @Bean
    public Binding fanoutQueue2Binding(Queue fanoutQueue2, FanoutExchange fanoutExchange){
        return BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);
    }
}
问题 1:如何区分 fanoutQueue2Binding 方法参数中的 fanoutQueue2fanoutQueue1
  1. 依赖注入机制

    • Spring 会根据参数类型和名称进行 Bean 注入。
    • 参数 Queue fanoutQueue2 的名称与方法 fanoutQueue2() 定义的 Bean 名称一致,因此注入的是 fanoutQueue2() 方法生成的 Bean。
  2. 默认 Bean 匹配规则

    • 按类型:首先根据类型查找所有候选 Bean(这里有两个 Queue 类型的 Bean)。
    • 按名称:如果多个候选 Bean 类型相同,则按参数名匹配 Bean 名称(参数名 fanoutQueue2 匹配到方法名 fanoutQueue2 的 Bean)。
  3. 名称的重要性

    • 方法名作为默认的 Bean 名称。

    • 如果参数名与 Bean 名称不一致,可以使用 @Qualifier 注解显式指定 Bean:

      @Bean
      public Binding fanoutQueue2Binding(@Qualifier("fanoutQueue2") Queue queue, FanoutExchange fanoutExchange) {
          return BindingBuilder.bind(queue).to(fanoutExchange);
      }
问题 2:为什么默认 Bean 名称是方法名,而不是构造参数的值?
如何更改默认 Bean 名称?

通过 @Beanname 属性显式指定:

@Bean(name = "fanout.queue1")
public Queue fanoutQueue1() {
    return new Queue("fanout.queue1");
}
Spring 默认行为设计目的:
  1. 保持一致性:方法名表达了开发者的意图,默认作为 Bean 名称。
  2. 简化配置:无需显式指定名称,减少常见场景的复杂度。
  3. 避免歧义:构造参数值可能重复或不适合作为 Bean 名称。