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();
    }
}
相关推荐
2301_780789666 小时前
跨平台适配!SDK 游戏盾兼容全终端游戏场景
java·网络·ddos
ClickHouseDB6 小时前
ClickHouse Cloud 与 Snowflake 实时性价比对比:CostBench 测试中的 412 倍差距来
运维·数据库·系统架构
m0_639906947 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
学长毕设7 小时前
基于springboot的食品仓库管理系统
java·spring boot·后端
时间售卖铺8 小时前
触发器与函数实战:MySQL高效编程秘诀
运维·数据库·mysql·云原生
qetfw8 小时前
UOS MariaDB 数据库:安装、最小权限与备份验证
linux·数据库·mariadb·uos
步行cgn8 小时前
FormHttpMessageConverter 详解:Spring MVC 中表单数据的读写转换器
java·spring·mvc
龙亘川8 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
金銀銅鐵8 小时前
[Java] 用 CLI 展示 EnumMap 增删键值对时的内部变化
java·源码·ai编程
秋天的怀念_David8 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法