Spring中Bean的注入方式详解(3)

  在这个类中,有两个重载的构造函数,他们都有三个参数,在这种情况下使用type和index的方法都不能完成要求,这时候就需要他们两个属性同时使用了。

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->

<!-- 配置对象 -->
    <bean>
        <constructor-arg index="0" type="String">
            <value>Kevin</value>
        </constructor-arg>
        <constructor-arg index="1" type="String">
            <value>China</value>
        </constructor-arg>
        <constructor-arg index="2" type="int">
            <value>20</value>
        </constructor-arg>
    </bean>
   
</beans>

  可以看到其实重点在于第三个入参的类型,所以我们在配置文件中指定了索引和类型,这样便可以使得Spring知道对哪个构造函数进行参数注入了。

  Tips:加入我们得配置文件中存在歧义问题,Spring容器是可以正常启动的,并不会报错,它将随机采用一个匹配的构造函数实例化bean。而随机选择的构造函数可能并不是用户所需要的,所以我们在编程时要小心避免出现这种歧义情况。

【通过自身类型反射匹配入参】

  如果bean构造函数入参的类型是可辨别的,由于java反射机制可以获取构造函数入参的类型,即使构造函数的注入不提供类型和索引的信息,Spring依旧可以完成构造函数信息的注入。例如下面实例中Manager类的构造函数的入参类型就是可以辨别的。

编写Manager类:

package com.Kevin.bean;
/**
 * 编写Bean测试通过自身类型反射匹配入参方式
 * @author Kevin
 *
 */

public class Manager {
    private String name;
    private Double salary;
    private Person person;
    public Manager(String name, Double salary, Person person) {
        super();
        this.name = name;
        this.salary = salary;
        this.person = person;
    }
   

}

编写配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->

<!-- 配置对象 -->
    <bean>
        <constructor-arg>
            <value>Kevin</value>
        </constructor-arg>
        <constructor-arg>
            <ref bean="user"/>
        </constructor-arg>
        <constructor-arg>
            <ref bean="person"/>
        </constructor-arg>
    </bean>
   
</beans>

  以上几种方法都可以实现构造函数参数的注入,但是为了避免问题的发生,还是建议使用显式的index和type来配置构造函数的入参信息。

3.工厂方法注入

  工厂方法是应用中被经常使用的设计模式,也是控制反转和单实例设计思想的主要实现方法。工厂类负责创建一个或多个工厂类实例,工厂类方法一般以接口或抽象类变量的形式返回目标类实例。

  工厂类对外屏蔽了目标类的实例化步骤,调用者甚至根本不用指定具体的目标类是什么。由于Spring容器以框架的方法提供工厂方法的功能,并以透明的方式开放给开发者。因此很少需要手工编写工程方法。但在一些遗留系统或第三方类库中还是会碰到工程方法,此时便可以使用Spring工厂注入的方法来进行Spring的注入。

  Spring工厂注入的方法可以分为静态和非静态两种。

【非静态工厂方法】

  有些工厂方法是非静态的,必须实例化工厂类之后才能调用工厂方法。下面通过一个实例来演示。

编写工厂类:

package com.Kevin.factorybean;
/**
 * 编写工厂类测试非静态工厂方法注入
 * @author Kevin
 *
 */

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/4f30f7ef1566725949f1f3149da0318c.html