Spring IOC入门

一、为啥需要IOC?

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

java 复制代码
// 传统写法
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文件,把要管理的对象和依赖都配置进去:

java 复制代码
<!-- 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了:

java 复制代码
// 初始化容器,获取对象
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文件,开启组件扫描。

java 复制代码
// 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();
    }
}
相关推荐
OxYGC3 小时前
[AI工程] Spring AI 第十四篇:Agent 五种模式在 2.0 里怎么写
java·spring·ai·ai编程
code2cat3 小时前
【随笔】从聊天到调用工具:理解MCP在AI应用中的位置
java·人工智能
2501_933923253 小时前
Spring Bean作用域揭秘:单例、原型、请求与会话的区别
java·后端·spring·java-ee
wuyk5553 小时前
【Socket 进阶之路】第 7 章 IO 多路复用 select & poll 完整实战|多 fd 监听、超时等待、优缺点横向对比
服务器·开发语言·网络·数据库·物联网
学编程就要猛3 小时前
基于Spring AI 的智能聊天机器人
java·spring ai·chat robot
修炼室3 小时前
Java开发工程师笔试经验贴【高频知识】
java
木井巳3 小时前
【记忆化搜索】最长递增子序列
java·算法·leetcode·深度优先·剪枝·推荐算法
文人sec3 小时前
grant 之后要跟着 flush privileges 吗?要不要使用分区表?
数据库·mysql·adb·数据分析
杨杨杨大侠4 小时前
知识库已经有了,Java 程序员还要做什么?Spring AI RAG 实战
java·openai·ai编程
伊信4 小时前
Spring AI 基础学习与应用
java·后端