前言
众所周知,Spring的核心技术是IOC容器,利用其可以更方便的创建和管理对象之间的依赖关系,所以今天详细讲解IOC容器创建对象的主要方式来加以理解。
创建对象的3种主要方式:
- 无参构造器创建对象
- 有参构造器创建对象
- 工厂类创建对象
1.使用无参构造函数创建对象
它是最基本的对象创建方式,调用的是默认的无参构造器,代码如下
Person.java
package pojo;
public class Person {
private String name;
private int age;
public Person() {
super();
System.out.println("无参构造器创建Person");
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
System.out.println("有参构造器创建Person");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
applicationContext.xml 配置如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置Person类,框架在底层使用反射的机制,执行无参构造器创建对象 -->
<bean name="person" class="pojo.Person">
<property name="name" value="刘三刀"></property>
<property name="age" value="20"></property>
</bean>
</beans>
测试:
@Test
public void test03() {
// 创建IOC容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("applicatonContext.xml");
// 获取容器中的对象
Person person = (Person) ac.getBean("person");
System.out.println(person);
}
测试结果:
2.使用有参构造函数创建对象
调用Person的有参构造器,包含参数有name、age,在默认情况下执行有参构造器
<!-- 带参构造函数创建Person类 -->
<bean name="person1" class="pojo.Person">
<!-- constructor-arg:有参构造的属性
index:表示构造器参数的索引位置
type:参数类型
value:赋值 -->
<constructor-arg index="0" type="java.lang.String" value="刘四刀" />
<constructor-arg index="1" type="int" value="22" />
</bean>
测试结果:
在对象创建的过程中,还可以使用配置文件中存在的对象来引入到其他对象中,通过ref来引入对象,如下所示。
<!-- ref的使用 -->
<bean name="str" class="java.lang.String">
<constructor-arg value="刘五刀" />
</bean>
<bean name="person2" class="pojo.Person">
<constructor-arg index="0" type="java.lang.String" ref="str" />
<constructor-arg index="1" type="int" value="23" />
</bean>
3.通过工厂类创建对象
工厂类分为实例工厂和静态工厂来创建对象,先创建Factory类
// 工厂类
public class Factory {
// 实例工厂
public Person getPerson() {
return new Person("实例工厂创建对象",1);
}
// 静态工厂,关键字static
public static Person getStaticPerson() {
return new Person("静态工厂创建对象",2);
}
}
- 实例工厂配置
<!-- 创建工厂bean -->
<bean name="factory" class="pojo.Factory"></bean>
<!-- 使用Factory类的实例方法getPerson,factory-bean指定工厂类,factory-method指定方法 -->
<bean name="person3" factory-bean="factory" factory-method="getPerson"></bean>
2.静态方法配置
<!-- 使用Factory类的静态方法,类只会被加载,不会被实例化,class指定工厂类(与实例不同的地方),factory-method指定静态方法(必须) -->
<bean name="person3" class="pojo.Factory" factory-method="getStaticPerson"></bean>
以上是鄙人对IOC容器创建对象的一些见解,如有纰漏,请指出。