• 首页
  • 邻居
  • 关于
  • 归档
  • 搜索
  • 夜间模式
    ©2020-2026  我的学习笔记 Theme by OneBlog

    我的学习笔记博客

    搜索
    标签
    # 随笔 # Java # 教程 # openwrt # Mysql # SQL # 爬虫 # post # Js调优 # MAVEN
  • 首页>
  • 随笔>
  • 正文
  • @EnableDubbo @SpringBootApplication

    2024年12月12日 1.2 k 阅读 0 评论 5837 字
    1. @EnableDubbo

    @EnableDubbo 是 Apache Dubbo 提供的注解,用来启用 Dubbo 的功能。它告诉 Spring 容器扫描并加载 Dubbo 的相关组件,包括 服务提供者 和 服务消费者。
    作用

    启用 Dubbo 自动配置:加载 Dubbo 的核心功能,比如注册服务、消费服务等。
    扫描指定包路径下的 Dubbo 注解:
        @DubboService:标记服务提供者(即要暴露给其他服务的接口实现)。
        @DubboReference:标记服务消费者(即调用远程接口)。
    

    常见使用

    @EnableDubbo
    @SpringBootApplication
    public class DubboApplication {

    public static void main(String[] args) {
        SpringApplication.run(DubboApplication.class, args);
    }

    }

    功能细节

    默认扫描主类(@SpringBootApplication 所在类)所在包及其子包中的 Dubbo 注解。
    可以指定扫描路径:
    
    @EnableDubbo(scanBasePackages = "com.example.dubbo.service")
    @SpringBootApplication
    public class DubboApplication {
        public static void main(String[] args) {
            SpringApplication.run(DubboApplication.class, args);
        }
    }
    
    1. @SpringBootApplication

    @SpringBootApplication 是 Spring Boot 提供的核心注解,用于标记一个 Spring Boot 应用的启动类。
    作用

    标记应用入口:这是 Spring Boot 应用的启动类(即 main 方法所在类)。
    启用 Spring Boot 自动配置:
        自动加载与应用相关的 Spring 配置(如 DataSource, JPA, RestController)。
        简化开发,无需手动配置 XML 或 Java 配置类。
    组件扫描:
        默认扫描当前类所在包及其子包中的所有组件(如 @Controller, @Service, @Component 等)。
    

    注解组合

    @SpringBootApplication 是以下 3 个注解的组合:

    @Configuration:声明当前类是一个配置类。
    @EnableAutoConfiguration:启用 Spring Boot 的自动配置机制。
    @ComponentScan:扫描当前包及子包中的组件。
    

    常见使用

    @SpringBootApplication
    public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

    }

    1. @EnableDubbo + @SpringBootApplication 的联合使用

    当 @EnableDubbo 和 @SpringBootApplication 一起使用时:

    @SpringBootApplication:
        加载 Spring Boot 的核心配置。
        提供一个运行时环境(包括 Web 服务、配置文件加载等)。
    @EnableDubbo:
        启用 Dubbo 的服务注册与发现功能。
        自动扫描并加载 Dubbo 的服务提供者和消费者。
    
    1. 示例
      服务提供者

    @EnableDubbo
    @SpringBootApplication
    public class ProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }

    }

    @DubboService(version = "1.0.0") // 暴露 Dubbo 服务
    public class HelloServiceImpl implements HelloService {

    @Override
    public String sayHello(String name) {
        return "Hello, " + name;
    }

    }

    服务消费者

    @EnableDubbo
    @SpringBootApplication
    public class ConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }

    }

    @RestController
    public class HelloController {

    @DubboReference(version = "1.0.0") // 引用 Dubbo 服务
    private HelloService helloService;
    
    @GetMapping("/sayHello")
    public String sayHello(@RequestParam String name) {
        return helloService.sayHello(name);
    }

    }

    配置示例

    application.yml 配置 Dubbo:

    dubbo:
    application:

    name: dubbo-example

    registry:

    address: zookeeper://127.0.0.1:2181

    provider:

    timeout: 3000

    consumer:

    check: false
    

    总结

    @EnableDubbo:启用 Dubbo 的功能,负责加载和扫描 Dubbo 的相关组件。
    @SpringBootApplication:Spring Boot 的核心注解,用来加载 Spring 的配置,构建运行时环境。
    两者结合使用,可以快速启动一个基于 Spring Boot 的 Dubbo 分布式服务应用。
    

    您说:
    为啥有些启动类不加@EnableDubbo也能被注册和发现
    ChatGPT 说:
    ChatGPT

    有些启动类在没有显式加 @EnableDubbo 的情况下,仍然能注册和发现 Dubbo 服务,通常是因为以下原因:

    1. Spring Boot 和 Dubbo 自动配置

    Spring Boot 和 Dubbo 集成时,使用了 Spring Boot Starter 和 自动配置机制。当项目中引入了 Dubbo 的 Starter 依赖(如 dubbo-spring-boot-starter),以下机制会自动启用 Dubbo 的功能:
    关键点

    Dubbo 的自动配置类:
        org.apache.dubbo.config.spring.context.annotation.DubboComponentScanRegistrar
        org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor
    

    这些自动配置类会扫描项目中的 Dubbo 注解(如 @DubboService, @DubboReference),并注册相关的服务。
    触发条件

    当 dubbo-spring-boot-starter 被引入,Spring Boot 的自动配置机制会:

    加载 DubboAutoConfiguration 类。
    自动启用 Dubbo 的核心功能,包括注册服务和消费服务。
    

    结论

    因此,即使没有手动加 @EnableDubbo,Dubbo 也可以通过 Spring Boot 的自动配置机制正常工作。

    1. Spring Boot 主类默认扫描包

    在 Spring Boot 应用中,@SpringBootApplication 默认会扫描当前类所在包及其子包中的所有组件,包括标注了 Dubbo 注解的类,例如:

    @DubboService:Dubbo 服务提供者。
    @DubboReference:Dubbo 服务消费者。
    

    如果 Dubbo 注解的类位于默认扫描路径中,Spring Boot 会自动发现并加载它们,无需额外配置。

    1. 隐式加载 Dubbo 的功能

    一些情况下,Dubbo 的功能被隐式加载:

    spring.factories 机制:
        Dubbo 的 Spring Boot Starter 通过 spring.factories 文件,加载自动配置类。
        例如,DubboAutoConfiguration 类会隐式启用 Dubbo 的相关功能。
    @DubboService 或 @DubboReference 自动触发:
        这些注解本身会触发服务注册和发现,即使没有显式使用 @EnableDubbo。
    
    1. 使用了默认的注解扫描路径

    在没有 @EnableDubbo 的情况下,Dubbo Starter 默认会扫描主类所在包和子包中包含的注解(如 @DubboService, @DubboReference),因此:

    如果启动类所在包路径和服务类一致,Dubbo 的注解会被正常加载。
    
    1. @EnableDubbo 作用的补充说明

    虽然 @EnableDubbo 显式启用 Dubbo 的注解扫描,但在以下情况下可以省略:

    项目中已经引入了 dubbo-spring-boot-starter,并且默认扫描路径包含了服务类。
    没有特殊的扫描路径需求(如需要扫描其他非默认包路径的 Dubbo 注解)。
    

    但加上 @EnableDubbo 的好处是:

    明确表明应用依赖 Dubbo 功能。
    可以自定义扫描路径,例如:
    
    @EnableDubbo(scanBasePackages = "com.example.services")
    @SpringBootApplication
    public class MyApplication {
        public static void main(String[] args) {
            SpringApplication.run(MyApplication.class, args);
        }
    }
    

    如何确认 Dubbo 的自动配置生效?

    可以通过以下方法确认 Dubbo 的自动配置是否生效:

    查看 Spring Boot 日志:
        如果 Dubbo 的自动配置生效,启动时日志会显示类似:
    
    [Dubbo] The Dubbo application [xxx] has been registered to Zookeeper [127.0.0.1:2181]
    

    启用 Debug 日志: 在 application.yml 中启用自动配置调试:

    logging:
      level:
        org.apache.dubbo: DEBUG
        org.springframework.boot.autoconfigure: DEBUG
    
    排查自动装配状态: 使用 Spring Boot 的 ConditionEvaluationReport 检查自动装配状态:
        启动项目后访问 /actuator/conditions。
        查看 DubboAutoConfiguration 是否为 matched。
    

    总结

    没有显式加 @EnableDubbo 的启动类能正常工作,是因为 Spring Boot 自动配置机制 和 Dubbo Starter 的自动装配。
    如果服务类或消费者类位于默认扫描路径中,Dubbo 会自动扫描并加载它们。
    建议:显式加上 @EnableDubbo 可以增强可读性,尤其是需要自定义扫描路径时。
    本文著作权归作者 [ admin ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。
    取消回复

    发表留言
    回复

    首页邻居关于归档
    Copyright©2020-2026  All Rights Reserved.  Load:0.017 s
    京ICP备18019712号
    Theme by OneBlog V3.6.5
    夜间模式

    开源不易,请尊重作者版权,保留基本的版权信息。