Spring框架:深入理解bean实例化与IOC依赖注入

0 下载量 134 浏览量 更新于2024-09-03 收藏 92KB PDF 举报
"Spring bean的实例化和IOC依赖注入详解" 在Spring框架中,IOC(Inversion of Control,控制反转)是核心概念之一,它负责管理对象的生命周期和对象间的依赖关系。Spring通过IOC容器实现这一功能,使得开发者不再需要手动创建和管理对象,而是将这些工作交由容器处理。这大大提高了代码的可测试性和可维护性。 当我们谈论Spring Bean的实例化,是指Spring如何根据配置创建对象。Spring提供了多种方式来实例化Bean,包括默认构造器、工厂方法、单例或多例等。在Spring中,Bean定义(BeanDefinition)存储了关于如何创建和配置Bean的信息,如类名、属性值、依赖项等。 在上述代码中,`DefaultListableBeanFactory.preInstantiateSingletons()`方法是实例化和初始化单例Bean的起点。这个方法遍历所有的BeanDefinition,并对非抽象、单例且非懒加载的Bean进行处理。`getBean(beanName)`是关键,它触发了Bean的实例化和依赖注入过程。 `getBean`方法内部首先调用`doCreateBean`,在这个过程中,Spring执行以下步骤: 1. **反射实例化**:Spring通过反射调用Bean定义中的构造函数创建Bean实例。如果Bean定义中指定了工厂方法,那么会使用工厂方法来创建对象。 2. **依赖注入**:在Bean实例化之后,Spring进行依赖注入。依赖注入有两种方式:setter注入和构造器注入。Spring会查找Bean定义中的属性值,匹配相应的setter方法或构造器参数,然后调用这些方法/构造器,将依赖对象传入。 3. **初始化回调**:实例化和依赖注入完成后,Spring会调用Bean的初始化方法(如果定义了`init-method`属性)。这样允许Bean在完全准备就绪后执行特定的初始化逻辑。 4. **注册到单例缓存**:对于单例Bean,Spring将其添加到缓存中,以便后续请求可以直接从缓存获取,而无需重复创建。 5. **AOP代理**:如果Bean配置了AOP拦截器,Spring会创建一个代理对象,该代理对象将拦截方法调用并在调用前后执行拦截器逻辑。 6. **最终检查**:最后,Spring会确保Bean的所有依赖都已正确注入,如果发现任何未满足的依赖,将会抛出异常。 通过这样的流程,Spring实现了对Bean的全面管理,使应用程序更加灵活和易于维护。理解这个过程对于高效地使用Spring框架进行开发至关重要。