1. 什么是注入
注入(Injection)表示的意思是通过Spring工厂及配置文件,为所创建的对象成员变量赋值。为什么需要注入,可以通过以下代码来引出:
Person p = new Person();
// p对象的属性值硬编码在代码中
p.setId(123456);
p.setName("Tom");
通过硬编码赋值p对象的属性,会造成耦合,这充分验证了一句话“需要就是依赖,依赖就会存在耦合”。为了处理这种耦合,Spring提供了一种方式,通过配置文件注入属性的值,这样属性的取值就不会硬编码在代码中,更改属性的值只需要改配置文件即可。
注入属性的开发步骤可以是以下几步,最终可以把属性的赋值交由Spring进行管理。
1. 定义类时,为类的成员属性,提供属性的get set方法
class Person {
priavte String id;
private String name;
set;
get;
}
2. 通过Spring配置文件进行注入配置
<bean id = "p" class = "x.x.Person">
<property name = "id">
<value>12345</vaule>
</property>
<property name = "name">
<value>Tom</vaule>
</property>
</bean>
上述复制的方式等效于
p.setId("123456")
p.setName("Tom");
可以看到通过把属性提取到配置文件中配置,可以解耦合。其实,在底层,Spring就是调用的属性的set访问来赋值。所以我们称这种注入叫做set注入。
2. Spring创建对象的方式
Spring创建对象有三种方式:
1. 反射模式
2. 工厂方法模式
3. Factory Bean模式
2.1. 反射模式
反射模式创建对象,就是我们熟知的,使用<bean class="xx">标签,使用该标签,Spring则会使用反射创建该对象。这里我们可以讨论两个细节,分别是无参构造的类,有参构造的类使用Spring该怎么创建对象。
public class Person {
public Person() {}
public Person(String name) {}
}
// 1. 无参构造创建对象
<bean id="p" class="Person"/>
// 2. 有参构造创建对象
<bean id="p" class="Person">
<constructor-arg name="name" value="Tom"/>
</bean>
2.2. 工厂方法模式
工厂方法模式中,Spring不会直接利用反射机制创建bean对象, 而是会利用反射机制先找到Factory类,然后利用Factory再去生成bean对象。工厂方法模式可以分为两类,分别是静态工厂方法模式,和实例工厂方法模式。
静态工厂方法模式:
public class Person {
}
// 静态工厂方法模式
public class PersonFactory {
private static Person p;
static {
p = new Person();
}
public static Person getPerson() {
return p;
}
}
<bean id="person" class="PersonFactory" factory-method="getPerson"/>
动态方法工厂模式:
// 动态工厂方法模式
public class PersonFactory {
private Person p = new Person();
public Person getPerson() {
return p;
}
}
<bean id="factory" class="PersonFactory"/>
<bean id="person" factory-bean="factory" factory-method="getPerson" />