第四章:Spring注入(Injection)的基本概念

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" />
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容