Spring IOC容器中依赖注入(Dependency Infection, DI)(1)

Spring中怎样较好地创建对象是很重要的,常见的是依赖注入是对对象定义其依赖的过程。当容器在创建bean的时候会注入依赖。

常见的依赖注入有基于构造器的依赖注入、Setter注入、静态工程方法注入。

基于构造器的依赖注入

通过容器利用携带一些参数的构造器来完成基于构造器的依赖注入,其中构造器的每一个参数就表示一个依赖。

public class SimpleMovieLister{
    
    // the SimpleMovieLister has a dependency on a MovieFinder
    private final MovieFinder movieFinder;

    // a constructor so that the Spring container can inject a MovieFinder
    public SimpleMovieLister(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }
}

通过构造器,Spring容器可以实现注入MovieFinder

但是要注意构造器参数的判断!!!

packege x.y;

public class ThingOne {
    public ThingOne(ThingTwo thingTwo, ThingThree thingThree) {
        // ...
    }
}
<beans>
    <bean id="beanOne" class="x.y.ThingOne">
        <constructor-arg ref="beanTwo"/>
        <constructor-arg ref="beanThree"/>
    </bean>

    <bean id="beanTwo" class="x.y.ThingTwo"/>

    <bean id="beanThree" class="x.y.ThingThree"/>
</beans>

如上所示,如果bean定义的构造函数参数中不存在潜在的歧义,那么在bean定义中定义构造函数参数的顺序就是在实例化bean时将这些参数提供给相应构造函数的顺序。

如上所示,在知道引用类型的情况下,可使用顺序来进行构造,但是当Spring不知道值的类型时,此时是无法通过类型进行匹配。如下所示:

package examples;

public class ExampleBean {

    // Number of years to calculate the Ultimate Answer
    private final int years;

    // The Answer to Life, the Universe, and Everything
    private final String ultimateAnswer;

    public ExampleBean(int years, String ultimateAnswer) {
        this.years = years;
        this.ultimateAnswer = ultimateAnswer;
    }
}

此时需要手动告诉类型

<bean id="exampleBean" class="examples.ExampleBean">
	<constructor-arg type="int" vlaue="750000"/>
    <constructor-arg type="java.lang.String" value="42"/>
</bean>

也可以设置索引,但是索引需要从0开始。

<bean id="exampleBean" class="examples.ExampleBean">
	<constructor-arg index="0" value="7500000"/>
    <constructor-arg index="1" value="42"/>
</bean>

还可以直接用name,但是这种方式需要在编译代码时启用调试标志,以便Spring可以从构造函数中查找参数名。

<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg name="years" value="7500000"/>
    <constructor-arg name="ultimateAnswer" value="42"/>
</bean>

如果不启动调试标志,可使用@ConstructorProperties JDK注解显式命名构造函数参数。

package examples;

public class ExampleBean {

    // Fields omitted

    @ConstructorProperties({"years", "ultimateAnswer"})
    public ExampleBean(int years, String ultimateAnswer) {
        this.years = years;
        this.ultimateAnswer = ultimateAnswer;
    }
}

参考

Bean-dependency

同名公众号

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值