本文章是为想要学习springboot的人而编写的教程旨在用简单易懂的语言来讲解帮助广大学生了解javaweb学习springboot之前应该先了解spring famework。本文章适合有一定java基础的同学阅读作者之后还会出java教程。一、SpringFramework 概述了解一门技术先要了解它是什么了解这些方式最直接的方式是借助官方文档我们打开spring的官方文档以下是网址Spring Frameworkhttps://spring.io/projects/spring-framework我们可以看到这样的描述Spring 框架为现代基于 Java 的企业级应用提供一套完备的编程与配置模型可适配任意部署平台。Spring 的核心优势之一是在应用层提供完善的基础设施支撑Spring 专注处理企业应用的底层通用基建让开发团队只需聚焦业务逻辑开发无需与特定部署环境强耦合、受其束缚。1、SpringFramework的组成结构SpringFramework是一个分层的架构它包含一系列的要素并且分为若干个模块下面简单描述这些核心模块的含义和作用。1IOC控制反转把对象的创建和调用权交给Spring容器管理而不是在代码中手动new对象。2AOP是基于面向对象编程的补充可以支持开发者定义一些方法的切入点和增强器用于将一些通用逻辑代码与业务功能代码相分离降低其耦合度。3数据访问4web5测试2、开发环境准备JDK17及以上Maven3.6IDEA2023.2.5Ultimate及以上以上都是准备工作接下来我们正式开始。二、什么是IOC控制反转Inverse of Control IOC对于刚开始学习Spring Framework的同学可能不是那么容易理解我将从一个场景开始推导IOC思想的实现过程。项目结构如下可能有的同学连MVC都不是很了解我在这里简单的说明一下。其实我们这里列举的例子更偏向于更早的Java Web三层架构1.项目分析1.servlet控制层Controller我们想象一下一个用户前来我们的控制层就相当于一个接待员直接面对用户浏览器。它负责接收请求并决定给用户什么响应。告诉前端 / 用户我们系统提供哪些功能、哪些接口、能干哪些事 具体工作接收参数调用 Service响应结果。具体代码package org.example.servlet; import org.example.service.UserService; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.*; import java.io.IOException; WebServlet(/user) public class UserServlet extends HttpServlet { // ❌ 痛点2Servlet 必须知道 UserService 的具体类名 private UserService userService new UserService(); Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType(text/html;charsetUTF-8); System.out.println(【Servlet】收到注册请求); userService.register(); resp.getWriter().println(h1注册成功(传统方式)/h1); } }2.service业务层package org.example.service; import org.example.dao.UserDao; public class UserService { // ❌ 痛点1Service 必须知道 UserDao 的具体类名 private UserDao userDao new UserDao(); public void register() { System.out.println(【Service】正在校验用户信息...); userDao.save(); } }3.Dao层数据层package org.example.dao; public class UserDao { public void save() { System.out.println(【Dao】用户数据已存入 MySQL); } }好了其实你现在已经能发现问题了dao和service层都是自己new的,代码写死了依赖关系改一个地方全链路都要改。这就暴露出了最致命的问题这就是IOC要解决的痛点。我们想想该怎么改进。如果我们把对象的创建依赖的注入交给外部容器控制是不是能解决呢可以试着做一下——不要自己new让别人传给你这就是IOC的核心控制反转。要实现我们需要接口。2.改进不要直接依赖实现类依赖接口这样实现不用改代码。新建Dao接口package org.example.dao; public interface IUserDao { void save(); }(让 UserDao 实现这个接口public class UserDao implements IUserDao)Service层依赖接口不再new实现类Servlet层同样依赖接口最后我们手动实现一个简易的IOC容器IOC容器干两件事创建所有对象servletservicedao自动把依赖注入进去。package org.example.service; import org.example.dao.IUserDao; public class UserService { private IUserDao userDao; // ✅ 改进1只依赖接口 // ✅ 改进2提供 Setter等待外部注入 public void setUserDao(IUserDao userDao) { this.userDao userDao; } public void register() { System.out.println(【Service】正在校验用户信息...); userDao.save(); } }手写IOC容器package org.example.container; import org.example.dao.IUserDao; import org.example.dao.impl.UserDao; import org.example.service.UserService; import org.example.servlet.UserServlet; public class SimpleIOC { public static void main(String[] args) { System.out.println(--- 启动自定义 IOC 容器 ---); // 1. 【对象的创建权】交给容器 IUserDao userDao new UserDao(); UserService userService new UserService(); UserServlet userServlet new UserServlet(); // 2. 【依赖的管理权】交给容器这就是控制反转 System.out.println(容器正在组装零件...); userService.setUserDao(userDao); // 容器帮 Service 找 Dao userServlet.setUserService(userService); // 容器帮 Servlet 找 Service // 3. 交付使用 userServlet.doGet(null, null); } }一句话总结不自己new对象由ioc容器统一创建、管理对象并自动注入依赖。控制权从类反转到容器。两个核心动作IOC容器管理Bean对象DI(依赖注入)IOC容器把依赖的对象自动赋值给需要的类。 总之IOC是思想DI是实现方式。我们刚刚写的SimleIOC就是Spring IOC的迷你版。