spring-常用三种注入方式

Categories:

spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。


1.属性注入

属性注入是通过属性的set方法进行注入,需要注入的属性必须有set方法并且命名符合规范

<property name="属性名" value="基本类型的属性值"/>
<property name="属性名" ref="对象的bean的id"/>

1.1注入基本类型

<property name="属性名" value="属性值"/>

实体类

public class Master {
    private String name;
    private Integer age;
    //set、get略
}

配置bean并注入

<bean id="master" class="pojo.Master">
    <property name="name" value="张三"/>
    <property name="age" value="20"/>
</bean>

1.2注入对象类型

<property name="属性名" ref="对象bean的id"/>

实体类

public class Master {
    private Pet pet;
    //set、get略
}

配置bean并注入

<bean id="petBean" class="pojo.Cat"></bean>
<bean id="master" class="pojo.Master">
    <property name="pet" ref="petBean"/>
</bean>

2构造方法注入

Spring创建对象默认使用无参构造方法

2.1按类型注入

实体类

public class Master {
    private Pet pet;
    private String name;
    private Integer age;

    public Master() {
    }

    public Master(String name, Integer age, Pet pet) {
        this.name = name;
        this.age = age;
        this.pet = pet;
    }
}

配置bean

<bean id="petBean" class="pojo.Cat"></bean>
<bean id="master" class="pojo.Master">
    <!--注入基本数据类型-->
    <constructor-arg type="java.lang.Integer" value="20"/>
    <!-- 对于包含特殊字符的属性值,可以在value子节点使用CDATA -->
    <constructor-arg type="java.lang.String">
        <value><![CDATA[<sansan>]]></value>
    </constructor-arg>
    <!--ref用于注入对象类型-->
    <constructor-arg type="pojo.Pet" ref="petBean"/>
</bean>

2.2按位置注入

实体类同2.1

配置bean

<bean id="petBean" class="pojo.Cat"></bean>
<bean id="master" class="pojo.Master">
    <constructor-arg value="张三" index="0" />
    <constructor-arg value="20" index="1"/>
    <constructor-arg ref="petBean" index="2"/>
</bean>

3.工厂方法注入

通过调用工厂的方法来获取自己需要的对象

3.1静态工厂注入

实体类

public class PetShop {
    public static Pet getDog() {
        return new Dog();
    }

    public static Pet getCat() {
        return new Cat();
    }

    public static Pet getPet(String name) {
        if (name == "cat") {
            return new Cat();
        } else {
            return new Dog();
        }
    }
}

配置bean

<!--创建工厂bean,调用不带参数的方法-->
<bean id="catBean" class="pojo.PetShop"  factory-method="getCat"/>
<!--创建工厂bean,调用带参数的方法-->
<bean id="dogBean" class="pojo.PetShop"  factory-method="getPet">
    <constructor-arg value="dog"/>
</bean>

3.2实例工厂注入

实体类同3.1

配置bean

<bean id="shopBean" class="pojo.PetShop"></bean>
<bean id="petBean" factory-bean="shopBean" factory-method="getCat"></bean>