news 2026/3/27 15:05:13

Spring IOC入门

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring IOC入门

一、为啥需要IOC?

先举个咱们写作业常遇到的例子:做一个用户查询功能,得有UserService(业务层)和UserDAO(数据访问层),UserService要用到UserDAO。传统写法是这样的:

// 传统写法 public class UserDAO { public void queryUser() { /* 查数据库 */ } } public class UserService { // 直接new一个UserDAO private UserDAO userDAO = new UserDAO(); public void getUserInfo() { userDAO.queryUser(); } }

这种写法看着简单,但问题超明显——耦合度太高!如果后面要换数据库,得把UserDAO改成UserDAOImpl,这时候必须改UserService里的代码,特别麻烦。而且对象创建、依赖关系都要自己管,系统一复杂就乱套了,测试起来也不方便。

而IOC的作用就是解决这个问题:把创建对象、管理依赖的活儿从我们写的代码里抽出来,交给Spring容器来管,咱们只管写业务逻辑。

二、核心概念:IOC和DI到底是啥?

1. IOC(控制反转):核心是“控制权转移”。以前是我们用new手动创建对象,现在把这个控制权交给Spring容器,这就是“反转”。

2. DI(依赖注入):是实现IOC的具体方式。容器创建对象时,会自动把这个对象需要的依赖(比如UserService需要的UserDAO)塞进去,不用我们手动赋值。

总结:IOC是思想,DI是实现手段,核心都是让代码解耦、好维护。

三、Spring IOC怎么用?两种常用配置方式

1. 传统XML配置

早期Spring用XML配置Bean,需要写一个applicationContext.xml文件,把要管理的对象和依赖都配置进去:

<!-- applicationContext.xml --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userDAO" class="com.example.UserDAO"/> <bean id="userService" class="com.example.UserService"> <property name="userDAO" ref="userDAO"/&gt; <!-- 注入依赖 --> </bean> </beans>

然后从容器里拿对象用,不用自己new了:

// 初始化容器,获取对象 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = context.getBean("userService", UserService.class); userService.getUserInfo();

2. 主流注解配置(重点掌握)

现在都用注解配置,比XML简单太多!常用注解就几个,记熟就行:

  • @Component/@Service/@Repository/@Controller:标记类为Spring管理的Bean(后三个是分层专用,语义更清晰);

  • @Autowired:自动注入依赖;

  • @Configuration + @ComponentScan:替代XML文件,开启组件扫描。

// DAO层:用@Repository标记 @Repository public class UserDAO { public void queryUser() { System.out.println("查询用户"); } } // Service层:用@Service标记,@Autowired自动注入 @Service public class UserService { @Autowired private UserDAO userDAO; public void getUserInfo() { userDAO.queryUser(); } } // 配置类:替代XML @Configuration @ComponentScan(basePackages = "com.example") // 扫描指定包下的注解 public class SpringConfig {} // 调用方式 public class Main { public static void main(String[] args) { ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class); UserService userService = context.getBean(UserService.class); userService.getUserInfo(); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/22 21:32:58

DLSS版本管理革命:3分钟解锁游戏画质的隐藏潜能

DLSS版本管理革命&#xff1a;3分钟解锁游戏画质的隐藏潜能 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾为游戏画面的闪烁模糊而困扰&#xff1f;是否好奇为什么别人的游戏画面总是那么清晰流畅&#xff1f…

作者头像 李华
网站建设 2026/3/26 1:08:44

ResNet18应用指南:医疗影像辅助诊断系统

ResNet18应用指南&#xff1a;医疗影像辅助诊断系统 1. 引言&#xff1a;通用物体识别与ResNet-18的工程价值 在人工智能驱动医疗智能化的浪潮中&#xff0c;深度学习模型正从“感知世界”走向“理解生命”。尽管医学影像分析常依赖定制化网络结构&#xff08;如U-Net、Dense…

作者头像 李华
网站建设 2026/3/26 3:11:08

MOSFET基本工作原理实战案例:开关时序分析

深入MOSFET开关时序&#xff1a;从原理到实战的完整解析你有没有遇到过这样的问题&#xff1f;电路设计明明“照着手册来”&#xff0c;参数也都在范围内&#xff0c;可一上电测试&#xff0c;MOSFET发热严重、波形振荡、甚至直接烧毁。更离谱的是&#xff0c;控制器输出的PWM信…

作者头像 李华
网站建设 2026/3/27 12:49:08

C++:填充环形矩阵(附带源码)

项目背景详细介绍在算法学习与 C 基础训练中&#xff0c;矩阵类问题始终占据着非常重要的位置。其中&#xff0c;环形矩阵&#xff08;也称螺旋矩阵、蛇形矩阵&#xff09;填充问题&#xff0c;几乎是所有算法课程、面试、竞赛中的“常青题”&#xff0c;例如&#xff1a;LeetC…

作者头像 李华
网站建设 2026/3/26 3:18:32

C++:下载文件(附带源码)

项目背景详细介绍在真实的软件工程与系统开发中&#xff0c;“下载文件”是一个极其高频且基础的能力。几乎所有类型的软件&#xff0c;都会在某个阶段涉及文件下载&#xff0c;例如&#xff1a;软件自动更新程序插件 / 模块在线加载客户端资源包下载配置文件远程获取日志 / 数…

作者头像 李华
网站建设 2026/3/21 2:05:17

纪念币自动预约终极指南:从零开始实现95%成功率

纪念币自动预约终极指南&#xff1a;从零开始实现95%成功率 【免费下载链接】auto_commemorative_coin_booking 项目地址: https://gitcode.com/gh_mirrors/au/auto_commemorative_coin_booking 还在为每次纪念币发行时的手忙脚乱而苦恼吗&#xff1f;那种在预约页面反…

作者头像 李华