请看下面的详细讲解:
Spring Bean的实例化
Spring Bean 是由 Spring IOC 容器进行管理的对象,它的实例化过程分为两种:基于构造函数的实例化和基于静态工厂方法的实例化。
基于构造函数的实例化
基于构造函数的实例化是 Spring IOC 容器最基本的实例化方式,其基本流程如下:
- 在 Spring 配置文件中定义 Bean;
- 根据配置文件的定义,在 Spring 容器中找到对应的 BeanDefinition,其中 BeanDefinition 包含了 Bean 的属性值、依赖项等信息;
- Spring 容器根据 BeanDefinition 中的信息,调用 Bean 的构造函数创建 Bean 的实例;
4.Spring 容器通过反射机制,在 Bean 上设置属性或调用它的 set 方法装配依赖项。
示例一:
<bean id="person" class="com.example.Person">
<constructor-arg name="name" value="张三"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
</bean>
上述代码中,我们定义了一个 id 为 person
的 Bean,它的类为 com.example.Person
,在创建实例时,我们调用了带两个参数的构造函数,分别设置了属性 name
和 age
的值。
基于静态工厂方法的实例化
基于静态工厂方法的实例化是一种比较灵活的实例化方式,常常用于有特殊需求的对象实例化,它的基本流程如下:
- 在 Spring 配置文件中定义 Bean;
- 根据配置文件的定义,在 Spring 容器中找到对应的 BeanDefinition,其中 BeanDefinition 包含了 Bean 的属性值、依赖项等信息;
- Spring 容器调用静态工厂方法创建 Bean 实例;
- Spring 容器通过反射机制,在 Bean 上设置属性或调用它的 set 方法装配依赖项。
示例二:
<bean id="personFactory" class="com.example.PersonFactory"/>
<bean id="person" factory-bean="personFactory" factory-method="createPerson">
<constructor-arg name="name" value="张三"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
</bean>
上述代码中,我们定义了 id 为 personFactory
的工厂类,它的类为 com.example.PersonFactory
,在创建类实例时,我们调用了无参数构造函数;
我们在创建 id 为 person
的 Bean 时,通过 factory-bean
属性指定了工厂类实例,通过 factory-method
属性指定了静态工厂方法 createPerson
,即我们可以在 PersonFactory
的 createPerson
方法中进行一些特殊处理。
IOC依赖注入详解
IOC(Inversion of Control,控制反转)是 Spring 中最核心的思想之一,它将应用程序中各个组件之间的关系的管理从应用程序代码中解耦,由 Spring 容器来完成控制和维护。从而实现了更加松散耦合、方便测试和更高效的重构等优点。而依赖注入(Dependency Injection,DI)恰恰是控制反转的一种实现方式。
IOC 的实现方式主要有两种:基于构造函数的依赖注入和基于 Setter 方法的依赖注入。
基于构造函数的依赖注入
通过构造函数进行依赖注入,即在创建 Bean 实例时,需要将依赖项作为构造函数的参数传入,Spring 会自动创建对象并为其注入依赖项。示例代码如下:
<bean id="person" class="com.example.Person">
<constructor-arg name="name" value="张三"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
<constructor-arg ref="sex"></constructor-arg>
</bean>
<bean id="sex" class="com.example.Sex">
<constructor-arg name="name" value="男"></constructor-arg>
</bean>
上述代码中,我们创建了 id 为 person
的 com.example.Person
实例,并将 sex
对象作为构造函数的参数传入(注意这里的 sex
实例是通过 id 注入的)。
基于 Setter 方法的依赖注入
通过 Setter 方法进行依赖注入,即使用 setProperty()
方法将依赖项作为实例属性进行赋值,Spring 会自动根据属性类型和名称自动装配依赖项。示例代码如下:
<bean id="person" class="com.example.Person">
<property name="name" value="张三"></property>
<property name="age" value="18"></property>
<property name="sex" ref="sex"></property>
</bean>
<bean id="sex" class="com.example.Sex">
<constructor-arg name="name" value="男"></constructor-arg>
</bean>
上述代码中,我们创建了 id 为 person
的 com.example.Person
实例,并使用 setProperty()
方法将 sex
对象作为实例属性进行赋值(注意这里的 sex
实例也是通过 id 注入的)。
至此,我们讲述了 Spring Bean 的实例化和 IOC 依赖注入的详细攻略,希望对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring bean的实例化和IOC依赖注入详解 - Python技术站