在现代 Java 企业级开发领域,Spring、Spring Boot 和 MyBatis-Plus
这三个名字如雷贯耳。它们构成了绝大多数 Java 后端项目的技术骨架,被誉为 Java 开发的"三驾马车"。
然而,许多开发者,尤其是初学者,常常对这三者的角色定位和相互关系感到困惑。本文将深入剖析这套"黄金组合",揭示它们如何各司其职又相辅相成,共同塑造了高效的Java 开发生态。
一、基石与灵魂:Spring Framework
如果把整个 Java 技术栈比作一座大厦,那么 Spring Framework 就是深埋地下的基石和贯穿整体的钢筋混凝土结构。它不仅是技术的基础,更是设计思想的体现。
1.1 核心问题:解决企业级开发的复杂性
在 Spring 诞生之前,Java EE 开发显得笨重而复杂。EJB 的配置繁琐、测试困难,代码耦合度极高,开发效率低下。Spring 的核心使命就是解耦,它通过两大革命性思想重塑了 Java 开发模式:
IoC(控制反转):权力的转移
传统编程中,对象自己控制其依赖的创建与查找:
// 传统方式:紧耦合
public class UserService {
private UserRepository userRepository = new UserRepositoryImpl();
// 对象自己控制依赖,难以测试和扩展
}
IoC 将这个控制过程"反转"了——由一个统一的容器来负责对象的生命周期和依赖关系:
// IoC 方式:松耦合
@Component
public class UserService {
private final UserRepository userRepository;
// 容器通过构造函数注入依赖
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository; // 依赖由外部提供
}
}
DI(依赖注入):IoC 的实现方式
DI 是 IoC 的具体实现技术,容器通过构造函数、Setter 方法等方式,将依赖对象"注入"到目标对象中。
依赖注入的三种方式:
// 1. 构造器注入(推荐)
@Service
public class OrderService {
private final PaymentService paymentService;
public OrderService(PaymentService paymentService) {
this.paymentService = paymentService;
}
}
// 2. Setter 注入
@Service
public class ProductService {
private InventoryService inventoryService;
@Autowired
public void setInventoryService(InventoryService inventoryService) {
this.inventoryService = inventoryService;
}
}
// 3. 字段注入(不推荐,但常见)
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
}
1.2 核心特性深度解析
AOP(面向切面编程):横切关注点的模块化
业务系统中总有一些横跨多个模块的功能点,如日志、事务、安全校验等。AOP 允许将这些"横切关注点"模块化为独立的切面。
实战示例:统一日志记录
@Aspect
@Component
@Slf4j
public class LoggingAspect {
/**
* 拦截 Service 层所有方法执行
*/
@Before("execution(* com.example.service.*.*(..))")
public void logMethodCall(JoinPoint joinPoint) {
String methodName = joinPoint.getSignature().getName();
String className = joinPoint.getTarget().getClass().getSimpleName();
Object[] args = joinPoint.getArgs();
log.info("调用方法: {}.{}, 参数: {}", className, methodName, Arrays.toString(args));
}
/**
* 环绕通知:计算方法执行时间
*/
@Around("execution(* com.example.service.*.*(..))")
public Object measureExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
Object result = joinPoint.proceed();
long endTime = System.currentTimeMillis();
log.info("方法 {} 执行耗时: {}ms",
joinPoint.getSignature().getName(),
(endTime - startTime));
return result;
}
}
声明式事务管理
Spring 通过 @Transactional 注解,将复杂的事务管理模板化:
@Service
@Transactional
public class TransferService {
@Autowired
private AccountRepository accountRepository;
public void transferMoney(Long fromId, Long toId, BigDecimal amount) {
// 业务逻辑,Spring 自动管理事务
Account fromAccount = accountRepository.findById(fromId).orElseThrow();
Account toAccount = accountRepository.findById(toId).orElseThrow();
if (fromAccount.getBalance().compareTo(amount) < 0) {
throw new InsufficientBalanceException("余额不足");
}
fromAccount.setBalance(fromAccount.getBalance().subtract(amount));
toAccount.setBalance(toAccount.getBalance().add(amount));
accountRepository.save(fromAccount);
accountRepository.save(toAccount);
// 如果发生异常,事务会自动回滚
}
}
事务传播行为配置:
@Transactional(propagation = Propagation.REQUIRED,
isolation = Isolation.READ_COMMITTED,
timeout = 30,
rollbackFor = {BusinessException.class, DataAccessException.class})
public void businessOperation() {
// 复杂的业务操作
}
1.3 优势与挑战
核心优势:
🎯 高度解耦:依赖注入使组件间松耦合
🔧 强大的 AOP:横切关注点集中管理
📊 声明式编程:事务、缓存等复杂操作简单化
🧪 易于测试:依赖注入使单元测试变得简单
🌐 集成能力:对主流技术栈提供良好支持
面临的挑战:
⚠️ 配置复杂:XML 配置繁琐,学习曲线陡峭
🔄 依赖管理困难:版本冲突问题常见
🚀 启动速度慢:大型应用启动耗时
🏗️ 部署复杂:需要外部 Servlet 容器
二、革命与简化:Spring Boot
如果说 Spring Framework 提供了强大的引擎,那么 Spring Boot 就是一套"一键启动"的智能汽车系统。它让开发者从繁琐的配置中解放出来,专注于业务逻辑。
2.1 "约定大于配置"的哲学
Spring Boot 的核心设计理念是:为大多数场景提供合理的默认配置,开发者只需在特殊需求时覆盖这些配置。这种思想彻底改变了 Spring 应用的开发体验。
2.2 核心机制深度剖析
自动配置:智能化的魔法
当你引入 spring-boot-starter-web 依赖时,Spring Boot 会自动完成以下配置:
检测类路径:发现 Spring MVC 相关类
自动配置 Tomcat:内嵌 Web 服务器
注册 DispatcherServlet:Spring MVC 核心控制器
配置视图解析器、消息转换器等组件
设置默认端口:8080
自动配置原理:
// Spring Boot 自动配置类的典型结构
@Configuration
@ConditionalOnClass({Servlet.class, Tomcat.class, DispatcherServlet.class})
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
public class ServletWebServerFactoryAutoConfiguration {
@Bean
@ConditionalOnClass(name = "org.apache.catalina.startup.Tomcat")
public TomcatServletWebServerFactory tomcatServletWebServerFactory() {
return new TomcatServletWebServerFactory();
}
}
起步依赖:依赖管理的革命
Starter 将一组相关的依赖打包,解决版本冲突问题:
<!-- 一个依赖搞定 Web 开发所有需求 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 包含的依赖 -->
<!-- spring-boot-starter, spring-boot-starter-json, spring-boot-starter-tomcat -->
<!-- spring-webmvc, spring-web, 等等 -->
常用 Starter 列表:
spring-boot-starter-web:Web 应用开发
spring-boot-starter-data-jpa:JPA 数据访问
spring-boot-starter-security:安全认证
spring-boot-starter-test:测试支持
spring-boot-starter-actuator:应用监控
内嵌容器:颠覆传统部署方式
Spring Boot 应用打包为可执行 JAR:
# 传统部署
java -war myapp.war # 需要外部 Tomcat
# Spring Boot 方式
java -jar myapp.jar # 内置容器,直接运行
2.3 Actuator:生产级监控能力
Spring Boot Actuator 提供完整的应用监控方案:
配置示例:
management:
endpoints:
web:
exposure:
include: "health,info,metrics,env"
endpoint:
health:
show-details: always
metrics:
enabled: true
核心监控端点:
GET /actuator/health:应用健康状态
GET /actuator/metrics:JVM 和系统指标
GET /actuator/env:环境配置信息
GET /actuator/info:应用基本信息
POST /actuator/refresh:配置热更新
2.4 与 Spring Framework 的关系澄清
重要概念:Spring Boot 不是 Spring Framework 的替代品,而是建立在它之上的一层自动化配置和快速开发的抽象层。
// Spring Boot 应用入口
@SpringBootApplication // 包含 @Configuration, @EnableAutoConfiguration, @ComponentScan
public class Application {
public static void main(String[] args) {
// 启动 Spring Boot 应用
SpringApplication.run(Application.class, args);
}
}
// 在 Spring Boot 中仍然可以使用所有 Spring 特性
@Configuration
@EnableTransactionManagement
@EnableCaching
public class AppConfig {
// 可以继续使用传统的 Spring 配置方式
}
三、效率与利器:MyBatis-Plus
在数据持久层,MyBatis 因其灵活性和对 SQL 的直接控制而备受青睐,但伴随着大量的重复性 CRUD 工作。MyBatis-Plus(MP) 应运而生,它"为简化开发而生",在保留 MyBatis 所有优点的同时,极大地提升了开发效率。
3.1 核心价值:告别重复的 CRUD
MP 的核心价值在于,通过极少的配置,实现大部分单表操作的无 SQL 化。
传统 MyBatis vs MyBatis-Plus:
// ========== 传统 MyBatis 方式 ==========
// 1. UserMapper.java
public interface UserMapper {
List<User> selectByCondition(@Param("name") String name,
@Param("age") Integer age);
}
// 2. UserMapper.xml
<!-- 需要编写复杂的 XML -->
<select id="selectByCondition" resultType="User">
SELECT * FROM user
WHERE 1=1
<if test="name != null and name != ''">
AND name LIKE CONCAT('%', #{name}, '%')
</if>
<if test="age != null">
AND age > #{age}
</if>
ORDER BY create_time DESC
</select>
// 3. 调用
List<User> users = userMapper.selectByCondition("张", 18);
// ========== MyBatis-Plus 方式 ==========
// 只需要这一行代码!
List<User> users = userMapper.selectList(
Wrappers.<User>lambdaQuery()
.like(User::getName, "张")
.gt(User::getAge, 18)
.orderByDesc(User::getCreateTime)
);
3.2 核心功能详解
通用 Mapper:基础 CRUD 的终极解决方案
只需继承 BaseMapper,即可获得丰富的 CRUD 方法:
public interface UserMapper extends BaseMapper<User> {
// 无需编写任何方法,自动拥有:
// - insert, deleteById, updateById
// - selectById, selectBatchIds, selectOne
// - selectList, selectCount, selectPage
// 等等超过 20 个常用方法
}
// 使用示例
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public void demoCRUD() {
// 新增
User user = new User();
user.setName("张三");
user.setAge(25);
userMapper.insert(user);
// 查询
User dbUser = userMapper.selectById(1L);
List<User> userList = userMapper.selectList(null);
// 更新
user.setAge(26);
userMapper.updateById(user);
// 删除
userMapper.deleteById(1L);
}
}
条件构造器:流畅的查询 API
MP 提供了强大的条件构造器,支持多种查询场景:
Lambda 条件构造器(推荐):
// Lambda 查询,编译期检查,避免字段名错误
LambdaQueryWrapper<User> queryWrapper = Wrappers.<User>lambdaQuery()
.like(StringUtils.isNotBlank(name), User::getName, name) // 条件判断
.gt(age != null, User::getAge, age) // 避免空指针
.between(User::getCreateTime, startDate, endDate) // 范围查询
.isNotNull(User::getEmail) // 非空查询
.in(User::getStatus, Arrays.asList(1, 2, 3)) // IN 查询
.groupBy(User::getDeptId) // 分组
.orderByDesc(User::getCreateTime) // 排序
.last("LIMIT 10"); // 自定义 SQL
List<User> users = userMapper.selectList(queryWrapper);
复杂查询示例:
// 多表关联查询(虽然 MP 主打单表,但复杂查询仍可配合 XML)
public interface UserMapper extends BaseMapper<User> {
// 复杂查询使用注解或 XML
@Select("SELECT u.*, d.dept_name FROM user u " +
"LEFT JOIN department d ON u.dept_id = d.id " +
"WHERE u.status = #{status}")
List<UserVO> selectUsersWithDept(@Param("status") Integer status);
}
// 或者使用 MP 的查询包装器进行简单的联表
LambdaQueryWrapper<User> wrapper = Wrappers.<User>lambdaQuery()
.select(User::getId, User::getName, User::getAge) // 指定查询字段
.eq(User::getStatus, 1)
.apply("dept_id IN (SELECT id FROM department WHERE level = {0}", 1);
代码生成器:极速项目启动
MP 的代码生成器可以快速生成全套代码:
public class CodeGenerator {
public static void main(String[] args) {
FastAutoGenerator.create("jdbc:mysql://localhost:3306/test", "root", "password")
.globalConfig(builder -> {
builder.author("developer") // 设置作者
.outputDir("D://code//java"); // 指定输出目录
})
.packageConfig(builder -> {
builder.parent("com.example") // 设置父包名
.moduleName("system") // 设置模块名
.entity("entity")
.service("service")
.controller("controller");
})
.strategyConfig(builder -> {
builder.addInclude("user", "role") // 设置需要生成的表名
.entityBuilder()
.enableLombok() // 启用 Lombok
.controllerBuilder()
.enableRestStyle(); // 开启生成 @RestController 控制器
})
.execute();
}
}
3.3 与 MyBatis 的关系
MP 完全兼容原生 MyBatis,你可以在享受 MP 便利的同时,继续使用 MyBatis 的所有特性:
public interface UserMapper extends BaseMapper<User> {
// 1. 使用 MP 提供的通用方法
// 自动拥有: selectById, insert, updateById 等方法
// 2. 自定义方法使用 MP 的条件构造器
default List<User> selectByComplexCondition(String name, Integer minAge) {
return selectList(Wrappers.<User>lambdaQuery()
.like(User::getName, name)
.gt(User::getAge, minAge));
}
// 3. 复杂查询继续使用原生 MyBatis 的 XML 配置
List<UserDTO> selectUserWithOrders(@Param("userId") Long userId);
}
// 对应的 XML 映射文件
// UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
<!-- MP 会自动注入通用 SQL,无需手动编写基础 CRUD -->
<!-- 复杂查询手动编写 -->
<select id="selectUserWithOrders" resultType="com.example.dto.UserDTO">
SELECT u.*, o.order_no, o.amount
FROM user u
LEFT JOIN order o ON u.id = o.user_id
WHERE u.id = #{userId}
</select>
</mapper>
四、黄金组合:现代 Java 后端技术栈实战
现在让我们看看这三个框架如何在实际项目中协同工作,构建一个完整的企业级应用。
4.1 项目架构视图
┌─────────────────────────────────────────────────────────────┐
│ 表现层 (Presentation Layer) │
├─────────────────────────────────────────────────────────────┤
│ @RestController ────── @Controller ────── 静态资源 │
└─────────────────────────────┬───────────────────────────────┘
│ HTTP 请求/响应
┌─────────────────────────────▼───────────────────────────────┐
│ 业务层 (Business Layer) │
├─────────────────────────────────────────────────────────────┤
│ @Service ────── @Transactional ────── AOP 切面 │
└─────────────────────────────┬───────────────────────────────┘
│ 方法调用
┌─────────────────────────────▼───────────────────────────────┐
│ 数据访问层 (Data Access Layer) │
├─────────────────────────────────────────────────────────────┤
│ BaseMapper ────── 条件构造器 ────── 自定义 XML │
└─────────────────────────────┬───────────────────────────────┘
│ JDBC
┌─────────────────────────────▼─────────────────────────────┐
│ 数据存储 (Data Storage) │
├─────────────────────────────────────────────────────────────┤
│ MySQL ────── Redis ────── ... │
└─────────────────────────────────────────────────────────────┘
4.2 完整项目示例
1. 项目依赖配置 (pom.xml)
<?xml version="1.0" encoding="UTF-8"?>
<project>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.0</version>
</parent>
<dependencies>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis-Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3</version>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 其他工具 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
2. 应用配置 (application.yml)
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8
username: root
password: 123456
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
id-type: auto
logic-delete-field: deleted
logic-delete-value: 1
logic-not-delete-value: 0
logging:
level:
com.example.mapper: debug
3. 实体类 (Entity)
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableLogic
private Integer deleted;
}
4. Mapper 接口
public interface UserMapper extends BaseMapper<User> {
// 使用 MP 的默认方法
// 复杂查询示例
@Select("SELECT u.*, COUNT(o.id) as order_count " +
"FROM user u LEFT JOIN order o ON u.id = o.user_id " +
"GROUP BY u.id")
List<UserVO> selectUserWithOrderCount();
}
5. Service 层
public interface UserService extends IService<User> {
Page<UserVO> getUserPage(PageRequest request);
List<UserVO> getUsersWithOrderCount();
}
@Service
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Override
@Transactional(readOnly = true)
public Page<UserVO> getUserPage(PageRequest request) {
LambdaQueryWrapper<User> wrapper = Wrappers.<User>lambdaQuery()
.like(StringUtils.isNotBlank(request.getName()), User::getName, request.getName())
.ge(request.getMinAge() != null, User::getAge, request.getMinAge())
.le(request.getMaxAge() != null, User::getAge, request.getMaxAge())
.orderByDesc(User::getCreateTime);
Page<User> page = baseMapper.selectPage(new Page<>(request.getPageNum(), request.getPageSize()), wrapper);
// 转换为 VO
return page.convert(user -> {
UserVO vo = new UserVO();
BeanUtils.copyProperties(user, vo);
return vo;
});
}
@Override
public List<UserVO> getUsersWithOrderCount() {
return baseMapper.selectUserWithOrderCount();
}
}
6. Controller 层
@RestController
@RequestMapping("/api/users")
@Validated
public class UserController {
@Autowired
private UserService userService;
@GetMapping
public ApiResult<Page<UserVO>> getUsers(PageRequest request) {
return ApiResult.success(userService.getUserPage(request));
}
@PostMapping
public ApiResult<Void> createUser(@Valid @RequestBody CreateUserRequest request) {
User user = new User();
BeanUtils.copyProperties(request, user);
userService.save(user);
return ApiResult.success();
}
@PutMapping("/{id}")
public ApiResult<Void> updateUser(@PathVariable Long id,
@Valid @RequestBody UpdateUserRequest request) {
User user = new User();
BeanUtils.copyProperties(request, user);
user.setId(id);
userService.updateById(user);
return ApiResult.success();
}
}
4.3 请求处理完整流程
当一个 HTTP 请求到达时,完整的处理流程如下:
1. HTTP Request →
2. Spring Boot 内嵌 Tomcat 接收 →
3. Spring MVC DispatcherServlet 路由 →
4. @RestController 接收请求 →
5. Spring DI 注入 Service →
6. @Transactional 开启事务 →
7. MyBatis-Plus Mapper 执行数据库操作 →
8. Spring AOP 处理切面逻辑 →
9. 返回 JSON 响应
五、生态扩展:更广阔的 Java 世界
除了这"三剑客",Java 生态中还有其他关键框架,共同构成了完整的解决方案:
5.1 Spring Cloud:微服务架构全家桶
当单体应用需要拆分为微服务时,Spring Cloud 提供了完整的解决方案:
# 微服务配置示例
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: yaml
核心组件:
服务注册与发现:Nacos、Eureka
配置中心:Nacos Config、Spring Cloud Config
服务网关:Spring Cloud Gateway
负载均衡:Spring Cloud LoadBalancer
服务容错:Spring Cloud Circuit Breaker
5.2 其他重要框架
Netty:高性能网络通信
// Netty 服务器示例
public class NettyServer {
public void start() {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
ch.pipeline().addLast(new ServerHandler());
}
});
ChannelFuture future = bootstrap.bind(8080).sync();
future.channel().closeFuture().sync();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}
Apache Dubbo:高性能 RPC 框架
// 服务提供者
@Service
public class UserServiceImpl implements UserService {
public User getUser(Long id) {
return userMapper.selectById(id);
}
}
// 服务消费者
@Reference
private UserService userService;
public void business() {
User user = userService.getUser(1L);
}
六、总结与展望
6.1 技术选型总结
框架 角色定位 核心价值 适用场景 学习曲线
Spring Framework 架构基石 解耦、AOP、声明式事务 任何需要架构规范的企业应用 陡峭
Spring Boot 开发加速器 自动配置、内嵌服务器、简化部署 快速开发、微服务、云原生 平缓
MyBatis-Plus 数据层效率工具 通用 CRUD、条件构造器、代码生成 需要高效数据操作的项目 平缓
6.2 学习路径建议
对于初学者:
第一阶段:掌握 Spring Framework 核心概念(IoC、DI、AOP)
第二阶段:学习 Spring Boot 快速开发
第三阶段:集成 MyBatis-Plus 提升数据层效率
第四阶段:深入 Spring Cloud 微服务生态
学习资源推荐:
官方文档:Spring.io、MyBatis-Plus 官网
实战项目:从简单的博客系统到复杂的电商平台
社区交流:GitHub、Stack Overflow、技术论坛
6.3 未来发展趋势
云原生:Spring Boot 3.x 对云原生的深度支持
响应式编程:Spring WebFlux 的广泛应用
GraalVM 原生镜像:更快的启动速度和更低的内存占用
服务网格:与 Istio 等服务网格技术的集成
6.4 结语
Spring Framework + Spring Boot + MyBatis-Plus 这个"黄金组合"之所以能成为业界事实标准,是因为它们各自在架构的不同层面上完美地解决了开发者的核心痛点:
Spring Framework 解决了架构规范问题,让代码更加优雅和可维护
Spring Boot 解决了开发效率问题,让项目启动和部署变得简单快捷
MyBatis-Plus 解决了数据操作问题,让数据库访问既灵活又高效
理解它们的设计思想、角色定位和相互关系,不仅是技术选型的基础,更是成为一名优秀的 Java 后端开发者的必经之路。随着技术的不断发展,这个生态体系仍在持续演进,为开发者提供更加强大和便捷的开发体验。
AI大模型学习福利
作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
一、全套AGI大模型学习路线
AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取
二、640套AI大模型报告合集
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

1866

被折叠的 条评论
为什么被折叠?



