在 Spring 中,IOC(Inversion of Control)容器负责对象的创建和管理,通过将对象的创建和依赖关系的管理从应用程序代码中分离出来,实现了解耦和灵活性。
一、IOC操作Bean管理
-
什么是Bean管理: Bean管理是指 Spring 容器创建对象并进行属性注入的过程。通过 IOC,Spring 容器负责创建对象、注入属性,从而实现对象的依赖关系和生命周期的管理。
-
Bean管理操作: Bean管理的操作涉及对象的创建和属性注入。可以通过基于XML配置文件或基于注解的方式来实现。
二、基于XML配置文件
-
创建对象: 首先,创建要实例化的类,确保它具有相应的属性和构造函数。
-
创建XML配置文件: 创建一个XML配置文件,比如
applicationContext.xml
,用于配置对象和它们的依赖关系。 -
定义Bean: 在配置文件中,使用
<bean>
元素定义对象(Bean)。设置id
属性来唯一标识每个对象,使用class
属性指定对象的类路径。<bean id="myBean" class="com.example.MyBean"></bean>
注意:创建对象默认会执行无参构造方法。
-
注入属性:
-
使用 Setter 方法进行注入:
a. 创建类:创建一个类,包含要注入的属性,并提供相应的 setter 方法。
public class MyBean { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } }
b. 创建XML配置文件:创建配置文件,配置对象的创建和属性注入。
c. 定义Bean:在配置文件中,使用
<bean>
元素定义对象,并使用<property>
元素注入属性。<bean id="myBean" class="com.example.MyBean"> <!-- 使用 <property> 元素注入属性 --> <property name="name" value="jack"></property> </bean>
d. 获取Spring容器:在代码中,获取 Spring 容器,并使用
getBean()
方法获取注入了属性的对象。ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); MyBean myBean = (MyBean) context.getBean("myBean");
-
使用有参构造方法进行注入:
a. 创建类:创建一个类,包含要注入的属性,并提供带有参数的构造方法。
public class MyBean { private String name; public MyBean(String name) { this.name = name; } public String getName() { return name; } }
b. 创建XML配置文件:创建配置文件,配置对象的创建和属性注入。
c. 定义Bean:在配置文件中,使用
<bean>
元素定义对象,并使用<constructor-arg>
元素注入构造方法的参数。<bean id="myBean" class="com.example.MyBean"> <!-- 使用 <constructor-arg> 元素来注入构造方法的参数 --> <constructor-arg name=”name” value="John" /> <!-- <constructor-arg index=”0” value="John" /> (name属性赋值的属性名,index是构造参数的位置) --> </bean>
d. 获取Spring容器:在代码中,获取 Spring 容器,并使用
getBean()
方法获取注入了参数的对象。ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); MyBean myBean = (MyBean) context.getBean("myBean");
-
-
XML注入其他类型属性:
-
注入null值:
<bean id="myBean" class="com.example.MyBean"> <property name="myProperty"> <null/> </property> </bean>
-
特殊字符:
使用
<![CDATA[ ... ]]>
来定义一个 CDATA 块,原样保留特殊字符。<property name="address"> <value> <![CDATA[<南京>]]> </value> </property>
-
外部bean:
<bean id="user" class="com.example.User"> <property name="username" value="john" /> </bean> <bean id="order" class="com.example.Order"> <property name="user" ref="user" /> </bean>
-
内部bean:
<bean id="outerBean" class="com.example.OuterBean"> <property name="innerBean"> <bean class="com.example.InnerBean"> <property name="value" value="Inner Bean Value" /> </bean> </property> </bean>
-
集合类型:
注入数组、List、Set 和 Map。
1. 注入数组:
<bean id="myBean" class="com.example.MyBean"> <property name="intArray"> <array> <value>1</value> <value>2</value> <value>3</value> </array> </property> </bean>
2. 注入List:
<bean id="myBean" class="com.example.MyBean"> <property name="stringList"> <list> <value>Value 1</value> <value>Value 2</value> <value>Value 3</value> </list> </property> </bean>
3. 注入Set:
<bean id="myBean" class="com.example.MyBean"> <property name="stringSet"> <set> <value>Value A</value> <value>Value B</value> <value>Value C</value> </set> </property> </bean>
4. 注入Map:
<bean id="myBean" class="com.example.MyBean"> <property name="stringMap"> <map> <entry key="Key 1" value="Value X" /> <entry key="Key 2" value="Value Y" /> <entry key="Key 3" value="Value Z" /> </map> </property> </bean>
5.集合中设置对象类型值(List)
<bean id="address1" class="com.example.Address"> <property name="city" value="New York" /> <property name="state" value="NY" /> </bean> <bean id="address2" class="com.example.Address"> <property name="city" value="Los Angeles" /> <property name="state" value="CA" /> </bean> <bean id="user" class="com.example.User"> <property name="username" value="john.doe" /> <property name="addresses"> <list> <ref bean="address1" /> <ref bean="address2" /> </list> </property> </bean>
-