32周Spring Cloud 基础

本文详细介绍微服务的概念、特点及拆分原则,并通过SpringCloud搭建微服务架构,包括服务注册与发现、服务间调用、负载均衡、断路器等功能,最后进行实操演示。

32周Spring Cloud 基础

  • 微服务的基本概念、设计与拆分原则
  • 微服务和Spring Cloud的关系
  • 微服务常见的组件和功能
  • 实战:springcloud查询案例
    • 分模块构建Spring Cloud项目
    • 完成课程列表、课程价格服务开发
    • 课程服务整合、服务注册与发现
    • 整合Feign实现服务间调用
    • 网关集成与开发
    • 服务的熔断与降级,进行实操演练
1. 微服务
1.1 什么是微服务
  • 单体应用的痛点
    • 引入依赖越来越多,部署效率低下
    • 团队协作开发成本高
    • 系统高可用性差
  • 解决单体痛点-服务化
    • 把传统的单机应用中的本地方法调用,改成通过RPC、HTTP产生的远程方法调用
    • 把模块从单体应用中拆分出来,独立成一个服务部署
  • 微服务概念
    • 微服务是一种架构风格,开发单个应用作为一系列小型服务的套件,其中每个服务都运行在自己的进行中,并且通过轻量级的机制实现彼此间通信,这通常是HTTP资源的API
    • 这些服务是围绕着业务功能构建的,并且可以通过完全自动化的部署机制进行独立部署
    • 而且这些服务的集中式管理做到了最小化(例如docker集中管理),每一种服务都可以通过不同的编程语言进行编写,并且可以使用不同的数据存储技术
1.2 微服务的特点
  1. 组件以服务形式来提供

  2. 微服务是一个产品,不是一个项目

  3. 轻量级通信、独立进行

  4. 分散治理、去中心化治理

  5. 容错性设计

  6. 会带来团队组织架构的调整

在这里插入图片描述

1.3 微服务的优缺点
  • 优点
    1. 服务简单、便于学习和上手,相对易于维护
    2. 独立部署,灵活扩展
    3. 技术栈丰富
  • 缺点
    1. 运维成本过高
    2. 接口可能不匹配
    3. 代码可能重复
    4. 架构复杂度提高
1.4 微服务的两大门派
  1. Spring Cloud :非常成熟的微服务框架,拥有众多子项目,提供一站式配套服务,可以快速构建分布式系统
    在这里插入图片描述

  2. Dubbo:高性能、轻量级的开源Java RPC框架,它提供了三大核心能力

    • 面向接口的远程方法调用
    • 只能容错和负载均衡
    • 服务发现与注册

    Dubbo提供的能力只是SpringCloud一部分

  3. 两者对别

  • 配套服务
核心组件SpringCloudDubbo
服务发现与注册SpringCloud Netflix EurekaZookeeper
服务调用方式REST API 、Feign、Ribbon(负载均衡)RPC
服务网关SpringCloud Netflix Zuul不提供
断路器SpringCloud Netflix Hystrix不提供
分布式配置SpringCloud Config本身不提供,可以与第三方组件联合配置使用(百度的disconf,阿里的diamond)
服务跟踪SpringCloud Sleuth同上(京东Hydra)
消息总线SpringCloud Bus不提供
数据流SpringCloud Stream不提供
批量任务SpringCloud Task同上(当当Elastic-Job)
  • 通信协议对别

    1. RPC
    2. REST(HTTP)
  • 总结

组装电脑 PK 品牌机

1.5 微服务拆分
  1. 什么时候进行服务化拆分
    • 第一阶段的主要目标是快速开发和验证想法
    • 进一步增加更多的新特性来吸引更多的目标用户
    • 项目复杂度过高,同时开发团队人员超过10人左右
  2. 不适合拆分
    • 小团队,技术基础较薄弱
    • 流量不高、压力小、业务变化也不大(比如OA)
    • 对延迟很敏感的低延迟高并发系统
  3. 微服务拆分两种方式
    • 纵向拆分(按照业务来拆分,商品服务、订单服务等)
    • 横向拆分
1.6 微服务扩展
  • 自动按需扩展

    根据CPU负载程度、特定时间(比如周末)、消息中间件的队列长度、业务具体规则、预测等来决定是否扩展

2. 实战:springcloud查询案例
  • 分模块构建Spring Cloud项目
  • 完成商品列表、商品价格服务开发
  • 课程服务整合、服务注册与发现
  • 整合Feign实现服务间调用
  • 负载均衡Ribbon
  • 断路器Hystrix
  • 网关集成与开发Zuul
  • 服务的熔断与降级,进行实操演练
"C:\Program Files\Java\jdk-17\bin\java.exe" -XX:TieredStopAtLevel=1 -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-Dmanagement.endpoints.jmx.exposure.include=*" "-javaagent:D:\IntelliJ IDEA Setup\IntelliJ IDEA 2022.3.3\lib\idea_rt.jar=50066:D:\IntelliJ IDEA Setup\IntelliJ IDEA 2022.3.3\bin" -Dfile.encoding=UTF-8 -classpath D:\apache-maven-3.9.2-bin\apc\专高三\第四\zk_parent02\zk_emp_service\target\classes;D:\mvn_repository\org\springframework\boot\spring-boot-starter-web\3.5.0\spring-boot-starter-web-3.5.0.jar;D:\mvn_repository\org\springframework\boot\spring-boot-starter\3.5.0\spring-boot-starter-3.5.0.jar;D:\mvn_repository\org\springframework\boot\spring-boot\3.5.0\spring-boot-3.5.0.jar;D:\mvn_repository\org\springframework\boot\spring-boot-starter-logging\3.5.0\spring-boot-starter-logging-3.5.0.jar;D:\mvn_repository\ch\qos\logback\logback-classic\1.5.18\logback-classic-1.5.18.jar;D:\mvn_repository\ch\qos\logback\logback-core\1.5.18\logback-core-1.5.18.jar;D:\mvn_repository\org\apache\logging\log4j\log4j-to-slf4j\2.24.3\log4j-to-slf4j-2.24.3.jar;D:\mvn_repository\org\apache\logging\log4j\log4j-api\2.24.3\log4j-api-2.24.3.jar;D:\mvn_repository\org\slf4j\jul-to-slf4j\2.0.17\jul-to-slf4j-2.0.17.jar;D:\mvn_repository\org\springframework\spring-core\6.2.7\spring-core-6.2.7.jar;D:\mvn_repository\org\springframework\spring-jcl\6.2.7\spring-jcl-6.2.7.jar;D:\mvn_repository\org\yaml\snakeyaml\2.4\snakeyaml-2.4.jar;D:\mvn_repository\org\springframework\boot\spring-boot-starter-json\3.5.0\spring-boot-starter-json-3.5.0.jar;D:\mvn_repository\com\fasterxml\jackson\core\jackson-databind\2.19.0\jackson-databind-2.19.0.jar;D:\mvn_repository\com\fasterxml\jackson\core\jackson-annotations\2.19.0\jackson-annotations-2.19.0.jar;D:\mvn_repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.19.0\jackson-datatype-jdk8-2.19.0.jar;D:\mvn_repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.19.0\jackson-datatype-jsr310-2.19.0.jar;D:\mvn_repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.19.0\jackson-module-parameter-names-2.19.0.jar;D:\mvn_repository\org\springframework\boot\spring-boot-starter-tomcat\3.5.0\spring-boot-starter-tomcat-3.5.0.jar;D:\mvn_repository\org\apache\tomcat\embed\tomcat-embed-core\10.1.41\tomcat-embed-core-10.1.41.jar;D:\mvn_repository\org\apache\tomcat\embed\tomcat-embed-el\10.1.41\tomcat-embed-el-10.1.41.jar;D:\mvn_repository\org\apache\tomcat\embed\tomcat-embed-websocket\10.1.41\tomcat-embed-websocket-10.1.41.jar;D:\mvn_repository\org\springframework\spring-web\6.2.7\spring-web-6.2.7.jar;D:\mvn_repository\org\springframework\spring-beans\6.2.7\spring-beans-6.2.7.jar;D:\mvn_repository\io\micrometer\micrometer-observation\1.15.0\micrometer-observation-1.15.0.jar;D:\mvn_repository\io\micrometer\micrometer-commons\1.15.0\micrometer-commons-1.15.0.jar;D:\mvn_repository\org\springframework\spring-webmvc\6.2.7\spring-webmvc-6.2.7.jar;D:\mvn_repository\org\springframework\spring-aop\6.2.7\spring-aop-6.2.7.jar;D:\mvn_repository\org\springframework\spring-context\6.2.7\spring-context-6.2.7.jar;D:\mvn_repository\org\springframework\spring-expression\6.2.7\spring-expression-6.2.7.jar;D:\mvn_repository\com\alibaba\cloud\spring-cloud-starter-alibaba-nacos-discovery\2021.0.6.1\spring-cloud-starter-alibaba-nacos-discovery-2021.0.6.1.jar;D:\mvn_repository\com\alibaba\cloud\spring-cloud-alibaba-commons\2021.0.6.1\spring-cloud-alibaba-commons-2021.0.6.1.jar;D:\mvn_repository\com\alibaba\nacos\nacos-client\2.2.0\nacos-client-2.2.0.jar;D:\mvn_repository\com\alibaba\nacos\nacos-auth-plugin\2.2.0\nacos-auth-plugin-2.2.0.jar;D:\mvn_repository\com\alibaba\nacos\nacos-encryption-plugin\2.2.0\nacos-encryption-plugin-2.2.0.jar;D:\mvn_repository\commons-codec\commons-codec\1.18.0\commons-codec-1.18.0.jar;D:\mvn_repository\com\fasterxml\jackson\core\jackson-core\2.19.0\jackson-core-2.19.0.jar;D:\mvn_repository\org\apache\httpcomponents\httpasyncclient\4.1.5\httpasyncclient-4.1.5.jar;D:\mvn_repository\org\apache\httpcomponents\httpcore\4.4.16\httpcore-4.4.16.jar;D:\mvn_repository\org\apache\httpcomponents\httpcore-nio\4.4.16\httpcore-nio-4.4.16.jar;D:\mvn_repository\org\apache\httpcomponents\httpclient\4.5.13\httpclient-4.5.13.jar;D:\mvn_repository\io\prometheus\simpleclient\0.16.0\simpleclient-0.16.0.jar;D:\mvn_repository\io\prometheus\simpleclient_tracer_otel\0.16.0\simpleclient_tracer_otel-0.16.0.jar;D:\mvn_repository\io\prometheus\simpleclient_tracer_common\0.16.0\simpleclient_tracer_common-0.16.0.jar;D:\mvn_repository\io\prometheus\simpleclient_tracer_otel_agent\0.16.0\simpleclient_tracer_otel_agent-0.16.0.jar;D:\mvn_repository\com\alibaba\spring\spring-context-support\1.0.11\spring-context-support-1.0.11.jar;D:\mvn_repository\org\springframework\cloud\spring-cloud-commons\3.1.8\spring-cloud-commons-3.1.8.jar;D:\mvn_repository\org\springframework\security\spring-security-crypto\6.5.0\spring-security-crypto-6.5.0.jar;D:\mvn_repository\org\springframework\cloud\spring-cloud-context\3.1.8\spring-cloud-context-3.1.8.jar;D:\mvn_repository\jakarta\annotation\jakarta.annotation-api\2.1.1\jakarta.annotation-api-2.1.1.jar;D:\mvn_repository\com\mysql\mysql-connector-j\8.0.31\mysql-connector-j-8.0.31.jar;D:\mvn_repository\com\alibaba\druid\1.2.23\druid-1.2.23.jar;D:\mvn_repository\com\baomidou\mybatis-plus-boot-starter\3.5.9\mybatis-plus-boot-starter-3.5.9.jar;D:\mvn_repository\com\baomidou\mybatis-plus\3.5.9\mybatis-plus-3.5.9.jar;D:\mvn_repository\com\baomidou\mybatis-plus-core\3.5.9\mybatis-plus-core-3.5.9.jar;D:\mvn_repository\com\baomidou\mybatis-plus-annotation\3.5.9\mybatis-plus-annotation-3.5.9.jar;D:\mvn_repository\com\baomidou\mybatis-plus-spring\3.5.9\mybatis-plus-spring-3.5.9.jar;D:\mvn_repository\com\baomidou\mybatis-plus-extension\3.5.9\mybatis-plus-extension-3.5.9.jar;D:\mvn_repository\org\mybatis\mybatis\3.5.16\mybatis-3.5.16.jar;D:\mvn_repository\org\mybatis\mybatis-spring\2.1.2\mybatis-spring-2.1.2.jar;D:\mvn_repository\com\baomidou\mybatis-plus-spring-boot-autoconfigure\3.5.9\mybatis-plus-spring-boot-autoconfigure-3.5.9.jar;D:\mvn_repository\org\springframework\boot\spring-boot-autoconfigure\3.5.0\spring-boot-autoconfigure-3.5.0.jar;D:\mvn_repository\org\springframework\boot\spring-boot-starter-jdbc\3.5.0\spring-boot-starter-jdbc-3.5.0.jar;D:\mvn_repository\com\zaxxer\HikariCP\6.3.0\HikariCP-6.3.0.jar;D:\mvn_repository\org\slf4j\slf4j-api\2.0.17\slf4j-api-2.0.17.jar;D:\mvn_repository\org\springframework\spring-jdbc\6.2.7\spring-jdbc-6.2.7.jar;D:\mvn_repository\org\springframework\spring-tx\6.2.7\spring-tx-6.2.7.jar;D:\apache-maven-3.9.2-bin\apc\专高三\第四\zk_parent02\zk_common\target\classes;D:\mvn_repository\org\projectlombok\lombok\1.18.38\lombok-1.18.38.jar;D:\apache-maven-3.9.2-bin\apc\专高三\第四\zk_parent02\zk_dept_service_feign\target\classes;D:\mvn_repository\org\springframework\cloud\spring-cloud-starter-openfeign\3.1.9\spring-cloud-starter-openfeign-3.1.9.jar;D:\mvn_repository\org\springframework\cloud\spring-cloud-starter\3.1.8\spring-cloud-starter-3.1.8.jar;D:\mvn_repository\org\springframework\security\spring-security-rsa\1.0.12.RELEASE\spring-security-rsa-1.0.12.RELEASE.jar;D:\mvn_repository\org\bouncycastle\bcpkix-jdk18on\1.73\bcpkix-jdk18on-1.73.jar;D:\mvn_repository\org\bouncycastle\bcprov-jdk18on\1.73\bcprov-jdk18on-1.73.jar;D:\mvn_repository\org\bouncycastle\bcutil-jdk18on\1.73\bcutil-jdk18on-1.73.jar;D:\mvn_repository\org\springframework\cloud\spring-cloud-openfeign-core\3.1.9\spring-cloud-openfeign-core-3.1.9.jar;D:\mvn_repository\org\springframework\boot\spring-boot-starter-aop\3.5.0\spring-boot-starter-aop-3.5.0.jar;D:\mvn_repository\org\aspectj\aspectjweaver\1.9.24\aspectjweaver-1.9.24.jar;D:\mvn_repository\io\github\openfeign\form\feign-form-spring\3.8.0\feign-form-spring-3.8.0.jar;D:\mvn_repository\io\github\openfeign\form\feign-form\3.8.0\feign-form-3.8.0.jar;D:\mvn_repository\commons-fileupload\commons-fileupload\1.5\commons-fileupload-1.5.jar;D:\mvn_repository\commons-io\commons-io\2.11.0\commons-io-2.11.0.jar;D:\mvn_repository\io\github\openfeign\feign-core\11.10\feign-core-11.10.jar;D:\mvn_repository\io\github\openfeign\feign-slf4j\11.10\feign-slf4j-11.10.jar;D:\mvn_repository\org\springframework\cloud\spring-cloud-starter-loadbalancer\3.1.8\spring-cloud-starter-loadbalancer-3.1.8.jar;D:\mvn_repository\org\springframework\cloud\spring-cloud-loadbalancer\3.1.8\spring-cloud-loadbalancer-3.1.8.jar;D:\mvn_repository\io\projectreactor\reactor-core\3.7.6\reactor-core-3.7.6.jar;D:\mvn_repository\org\reactivestreams\reactive-streams\1.0.4\reactive-streams-1.0.4.jar;D:\mvn_repository\io\projectreactor\addons\reactor-extra\3.5.2\reactor-extra-3.5.2.jar;D:\mvn_repository\org\springframework\boot\spring-boot-starter-cache\3.5.0\spring-boot-starter-cache-3.5.0.jar;D:\mvn_repository\org\springframework\spring-context-support\6.2.7\spring-context-support-6.2.7.jar;D:\mvn_repository\com\stoyanr\evictor\1.0.0\evictor-1.0.0.jar com.zt.EmpApplication 2025-07-24T20:07:32.076+08:00 INFO 22524 --- [zk-emp-service] [ main] c.a.n.client.env.SearchableProperties : properties search order:PROPERTIES->JVM->ENV->DEFAULT_SETTING 2025-07-24T20:07:32.078+08:00 WARN 22524 --- [zk-emp-service] [ main] c.a.nacos.client.logging.NacosLogging : Load Logback Configuration of Nacos fail, message: org/slf4j/impl/StaticLoggerBinder . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.5.0) 2025-07-24T20:07:32.107+08:00 WARN 22524 --- [zk-emp-service] [ main] c.a.nacos.client.logging.NacosLogging : Load Logback Configuration of Nacos fail, message: org/slf4j/impl/StaticLoggerBinder 2025-07-24T20:07:32.113+08:00 INFO 22524 --- [zk-emp-service] [ main] com.zt.EmpApplication : Starting EmpApplication using Java 17.0.12 with PID 22524 (D:\apache-maven-3.9.2-bin\apc\专高三\第四\zk_parent02\zk_emp_service\target\classes started by 26621 in D:\apache-maven-3.9.2-bin\apc\专高三\第四\zk_parent02) 2025-07-24T20:07:32.113+08:00 INFO 22524 --- [zk-emp-service] [ main] com.zt.EmpApplication : No active profile set, falling back to 1 default profile: "default" 2025-07-24T20:07:32.444+08:00 WARN 22524 --- [zk-emp-service] [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'empdao' defined in file [D:\apache-maven-3.9.2-bin\apc\专高三\第四\zk_parent02\zk_emp_service\target\classes\com\zt\dao\Empdao.class]: Invalid value type for attribute 'factoryBeanObjectType': java.lang.String 2025-07-24T20:07:32.449+08:00 INFO 22524 --- [zk-emp-service] [ main] .s.b.a.l.ConditionEvaluationReportLogger : Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. 2025-07-24T20:07:32.457+08:00 ERROR 22524 --- [zk-emp-service] [ main] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'empdao' defined in file [D:\apache-maven-3.9.2-bin\apc\专高三\第四\zk_parent02\zk_emp_service\target\classes\com\zt\dao\Empdao.class]: Invalid value type for attribute 'factoryBeanObjectType': java.lang.String at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryBean(AbstractAutowireCapableBeanFactory.java:864) ~[spring-beans-6.2.7.jar:6.2.7] at org.springframework.beans.factory.support.AbstractBeanFactory.getType(AbstractBeanFactory.java:745) ~[spring-beans-6.2.7.jar:6.2.7] at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAnnotationOnBean(DefaultListableBeanFactory.java:817) ~[spring-beans-6.2.7.jar:6.2.7] at org.springframework.boot.sql.init.dependency.AnnotationDependsOnDatabaseInitializationDetector.detect(AnnotationDependsOnDatabaseInitializationDetector.java:36) ~[spring-boot-3.5.0.jar:3.5.0] at org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer$DependsOnDatabaseInitializationPostProcessor.detectDependsOnInitializationBeanNames(DatabaseInitializationDependencyConfigurer.java:152) ~[spring-boot-3.5.0.jar:3.5.0] at org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer$DependsOnDatabaseInitializationPostProcessor.postProcessBeanFactory(DatabaseInitializationDependencyConfigurer.java:115) ~[spring-boot-3.5.0.jar:3.5.0] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:363) ~[spring-context-6.2.7.jar:6.2.7] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:197) ~[spring-context-6.2.7.jar:6.2.7] at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:791) ~[spring-context-6.2.7.jar:6.2.7] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:609) ~[spring-context-6.2.7.jar:6.2.7] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.5.0.jar:3.5.0] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753) ~[spring-boot-3.5.0.jar:3.5.0] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) ~[spring-boot-3.5.0.jar:3.5.0] at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) ~[spring-boot-3.5.0.jar:3.5.0] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1362) ~[spring-boot-3.5.0.jar:3.5.0] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1351) ~[spring-boot-3.5.0.jar:3.5.0] at com.zt.EmpApplication.main(EmpApplication.java:15) ~[classes/:na] 进程已结束,退出代码1
07-25
### 3.1 检查 MyBatis 或 MyBatis-Plus 的依赖版本 `factoryBeanObjectType` 类型错误通常出现在 MyBatis 或 MyBatis-Plus 的依赖版本不兼容的情况下。例如,使用 `mybatis-spring-boot-starter` 3.0.0 及以上版本时,与某些旧版本的 Spring Boot 不兼容,导致 Mapper 接口无法被正确识别为 Bean,从而引发 `factoryBeanObjectType` 错误。建议将 `mybatis-spring-boot-starter` 版本降级至 2.3.1 或 2.2.2,以确保与 Spring Boot 的兼容性: ```xml <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.2</version> </dependency> ``` 此问题在某些 Spring Boot 2.6.x 及以下版本中尤为常见,使用较低版本的 MyBatis Starter 可有效避免类型解析错误[^2]。 ### 3.2 确保正确使用 `@MapperScan` 注解 在 Spring Boot 主类或配置类上使用 `@MapperScan` 注解是识别 Mapper 接口的关键步骤。若未指定正确的包路径,Spring 将无法扫描到 Mapper 接口并生成代理类,从而导致 `factoryBeanObjectType` 错误。例如: ```java @SpringBootApplication @MapperScan("com.example.mapper") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 确保 `@MapperScan` 注解中指定的包路径与实际的 Mapper 接口路径一致,否则 Spring 无法正确注册 Mapper Bean,进而导致启动失败[^1]。 ### 3.3 确保 DAO 接口继承 BaseMapper(MyBatis-Plus) 若使用 MyBatis-Plus,则 DAO 接口应继承 `com.baomidou.mybatisplus.core.mapper.BaseMapper` 并指定对应的实体类作为泛型参数。例如: ```java public interface UserMapper extends BaseMapper<User> { } ``` 未正确继承 `BaseMapper` 接口会导致 Spring 无法识别该接口为有效的 Mapper Bean,从而引发 `factoryBeanObjectType` 错误。此外,确保引入了正确的 `mybatis-plus-boot-starter` 依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version> </dependency> ``` 该依赖提供了 MyBatis-Plus 的自动配置支持,确保接口能够被正确识别并注册为 Bean。 ### 3.4 检查 Mapper 接口的编译输出路径 Spring Boot 在启动过程中会加载编译后的 Mapper 接口类文件(位于 `target/classes` 目录下)。若接口未被正确编译或路径不一致,可能导致 Spring 无法识别该接口,从而引发 `factoryBeanObjectType` 错误。例如,若错误信息中出现: ``` Invalid bean definition with name 'userMapper' defined in file [E:\my_project\idea\ww-ai-agent\target\classes\com\ww\wwaiagent\mapper\UserMapper.class] ``` 应检查 `UserMapper.class` 是否确实存在于指定路径,并确认其内容是否与源码一致。可尝试清理并重新构建项目: ```bash mvn clean install ``` 此操作可确保所有 Mapper 接口被正确编译并放入目标目录,避免因编译问题导致的启动失败。 ### 3.5 检查 Spring Boot 的自动配置日志 查看 Spring Boot 启动日志,确认是否存在以下异常信息: - Mapper 接口未被扫描到。 - `factoryBeanObjectType` 属性解析失败。 - MyBatis 或 MyBatis-Plus 的自动配置异常。 日志中可能包含如下信息: ``` Caused by: java.lang.IllegalStateException: Invalid value type for attribute 'factoryBeanObjectType': java.lang.String ``` 通过日志可以定位具体出错的 Mapper 接口或配置项,从而采取针对性措施进行修复。 ### 3.6 配置 MyBatis Mapper XML 文件路径 确保在 `application.yml` 或 `application.properties` 中正确配置了 `mybatis.mapper-locations`,以便 Spring 能正确加载 XML 映射文件。例如: ```yaml mybatis: mapper-locations: classpath:/mapper/**/*.xml ``` 若未正确配置该属性,可能导致 Mapper 接口与 XML 文件绑定失败,从而影响 Bean 的创建过程,最终导致启动失败[^1]。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值