公司动态
spring-IOC、DI
IOC控制反转是什么传统开发开发者主动 new 创建对象、管理依赖控制反转把对象的创建、生命周期管理、依赖装配交给 Spring 容器控制权从代码转移到容器所以叫反转。IoC 容器里到底装了什么Bean 与 BeanFactorySpring 的 IoC 容器本质上是一个超级工厂它里面装满了由 Spring 管理的 Java 对象这些对象统称为 Bean。容器的核心接口是BeanFactorySpring 最底层的 IoC 容器提供最基础的管理功能延迟加载。ApplicationContext应用上下文它是 BeanFactory 的子接口功能更强大支持国际化、事件发布、AOP 集成等我们在实际开发中用的就是它。DIDependency Injection依赖注入在容器中建关系的整个过程是称为依赖注入。依赖注入它是实现 IoC 的一种主要方式。例如Servicepublic class UserService { private final UserDao userDao; public UserService(UserDao userDao) { this.userDao userDao; } }Spring 创建 UserService 时发现UserService ↓ 需要 UserDao ↓ IoC 容器查找 UserDao Bean ↓ 创建/获取 UserDao ↓ 注入 UserServiceSpring 是怎么知道哪些对象需要管理的1. 注解扫描例如Component public class UserDao { } Service public class UserService { } Controller public class UserController { }Spring 启动时进行组件扫描发现这些类以后把它们注册到 IoC 容器。2. Bean也可以手动注册Spring 会把返回的对象放入 IoC 容器。Configurationpublic class AppConfig { Bean public UserService userService() { return new UserService(); } }IoC 是怎么实现的Spring 主要通过 IoC 容器实现控制反转。项目启动时Spring 会扫描 Component、Service、Repository、Controller 等组件解析 Bean 定义并创建 Bean保存到 IoC 容器中。当某个 Bean 依赖其他 Bean 时Spring 根据依赖关系进行自动装配和注入例如通过 Autowired、Resource 或构造器注入完成依赖关系建立。Spring 启动 ↓ 加载配置 ↓ 组件扫描 ↓ 找到 Component、Service 等组件 ↓ 解析 Bean 定义 ↓ 创建 Bean ↓ 处理 Bean 依赖 ↓ 依赖注入 ↓ 初始化 Bean ↓ 放入 IoC 容器 ↓ 业务代码获取并使用 Bean降低耦合解析没有 IoC 时高耦合public class UserService { // 自己主动 new 实现类写死了 private UserDao userDao new MySqlUserDao(); public void doSomething() { userDao.save(); } }如果要把 MySqlUserDao 换成 OracleUserDao必须修改 UserService 的源码。使用 Spring IoC 后低耦合Service public class UserService { Autowired // 由容器把合适的实现注入进来 private UserDao userDao; public void doSomething() { userDao.save(); } } Repository public class OracleUserDao implements UserDao { ... }现在UserService 只依赖 UserDao 接口。至于容器注入的是 MySqlUserDao 还是 OracleUserDao完全由配置决定UserService 的源码无需改动。