Spring Boot3入门介绍----什么是IOC?
本文章是为想要学习springboot的人而编写的教程,旨在用简单易懂的语言来讲解,帮助广大学生了解javaweb,学习springboot之前应该先了解spring famework。
本文章适合有一定java基础的同学阅读,作者之后还会出java教程。
一、SpringFramework 概述
了解一门技术,先要了解它是什么,了解这些方式最直接的方式是借助官方文档,我们打开spring的官方文档,以下是网址
Spring Framework
https://spring.io/projects/spring-framework
我们可以看到这样的描述:
Spring 框架为现代基于 Java 的企业级应用,提供一套完备的编程与配置模型,可适配任意部署平台。
Spring 的核心优势之一,是在应用层提供完善的基础设施支撑:Spring 专注处理企业应用的底层通用基建,让开发团队只需聚焦业务逻辑开发,无需与特定部署环境强耦合、受其束缚。
1、SpringFramework的组成结构
SpringFramework是一个分层的架构,它包含一系列的要素并且分为若干个模块,下面简单描述这些核心模块的含义和作用。
(1)IOC
控制反转,把对象的创建和调用权交给Spring容器管理,而不是在代码中手动new对象。
(2)AOP
是基于面向对象编程的补充,可以支持开发者定义一些方法的切入点和增强器,用于将一些通用逻辑代码与业务功能代码相分离,降低其耦合度。
(3)数据访问
(4)web
(5)测试
2、开发环境准备
JDK:17及以上
Maven:3.6+
IDEA:2023.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 {
// ❌ 痛点2:Servlet 必须知道 UserService 的具体类名
private UserService userService = new UserService();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setContentType("text/html;charset=UTF-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 {
// ❌ 痛点1:Service 必须知道 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容器干两件事,创建所有对象,(servlet,service,dao),自动把依赖注入进去。
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的迷你版。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)