Spring5学习笔记 — IOC
发布人:shili8
发布时间:2025-03-11 17:59
阅读次数:0
**Spring5 学习笔记 — IOC**
**1.什么是IOC?**
IOC(Inversion of Control)即控制反转,是一个设计模式,用于解耦合依赖关系,使得程序更易于维护、测试和扩展。IOC 的核心思想是,将对象之间的依赖关系从静态的硬编码方式转变为动态的配置方式。
**2. IOC 的优点**
使用 IOC 有以下几个优点:
* **解耦合**:IOC 可以帮助我们解耦合对象之间的依赖关系,使得程序更易于维护和扩展。
* **测试友好**:IOC 支持单元测试,因为我们可以轻松地注入 mock 对象来替代真实的依赖。
* **灵活性**:IOC 允许我们在运行时动态配置对象之间的依赖关系。
**3. IOC 的实现**
Spring 框架提供了一个强大的 IOC 容器,用于管理和注入对象之间的依赖关系。下面是 IOC 的基本实现:
###3.1 BeanDefinitionBeanDefinition 是 IOC 容器中定义一个 bean 的元数据。它包含了 bean 的名称、类型、作用域等信息。
javapublic class BeanDefinition { private String name; private Class> type; private Scope scope; // getter 和 setter 方法}
###3.2 BeanFactoryBeanFactory 是 IOC 容器的核心接口。它提供了一个方法来获取 bean 的实例。
javapublic interface BeanFactory { Object getBean(String name) throws BeansException; }
###3.3 DefaultListableBeanFactoryDefaultListableBeanFactory 是 BeanFactory 接口的实现类。它负责管理和注入对象之间的依赖关系。
javapublic class DefaultListableBeanFactory implements BeanFactory { private MapbeanDefinitions = new HashMap<>(); public Object getBean(String name) throws BeansException { // 从 beanDefinitions 中获取 bean 的定义 BeanDefinition definition = beanDefinitions.get(name); if (definition == null) { throw new BeansException("No bean named '" + name + "' is defined."); } // 创建 bean 的实例 Object instance = createBeanInstance(definition); return instance; } }
###3.4 BeanFactoryAwareBeanFactoryAware 是一个接口,用于通知 bean 容器的实例。
javapublic interface BeanFactoryAware { void setBeanFactory(BeanFactory factory) throws BeansException; }
**4. IOC 的使用**
下面是一个简单的示例,演示了如何使用 IOC 来管理和注入对象之间的依赖关系。
###4.1 UserUser 是一个 bean,它需要依赖于 UserService。
javapublic class User { private String name; private UserService userService; public User(String name, UserService userService) { this.name = name; this.userService = userService; } public void printInfo() { System.out.println("Name: " + name); userService.printInfo(); } }
###4.2 UserServiceUserService 是另一个 bean,它需要依赖于 UserRepository。
javapublic class UserService { private UserRepository userRepository; public UserService(UserRepository userRepository) { this.userRepository = userRepository; } public void printInfo() { System.out.println("User service info:"); userRepository.printInfo(); } }
###4.3 UserRepositoryUserRepository 是一个 bean,它不需要依赖于其他 bean。
javapublic class UserRepository { public void printInfo() { System.out.println("User repository info:"); } }
###4.4 IOC 容器配置IOC 容器的配置如下:
xml<beans> <bean id="userRepository" class="com.example.UserRepository"/> <bean id="userService" class="com.example.UserService"> <property name="userRepository" ref="userRepository"/> </bean> <bean id="user" class="com.example.User"> <property name="name" value="John Doe"/> <property name="userService" ref="userService"/> </bean> </beans>
###4.5 IOC 容器使用IOC 容器的使用如下:
javapublic class Main { public static void main(String[] args) { DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); factory.registerBeanDefinition("userRepository", new BeanDefinition()); factory.registerBeanDefinition("userService", new BeanDefinition()); factory.registerBeanDefinition("user", new BeanDefinition()); User user = (User) factory.getBean("user"); user.printInfo(); } }
**5. 总结**
本文介绍了 IOC 的概念、优点和实现,以及如何使用 IOC 来管理和注入对象之间的依赖关系。通过一个简单的示例,我们演示了如何使用 IOC 容器来配置和获取 bean 的实例。