携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情
我们继续上一篇文章的内容开始介绍。
这篇文章我们来说说,如何使用xml 格式文件来完成通过静态工厂方法模式进行bean 的注册与依赖绑定。
如何在xml 文件中实现bean 的注册与依赖绑定
在第三方库提供了接口和静态工厂方法之后,我们将DependentedInterface 接口的实现类注入到Test 类中,并完成依赖绑定。
通过setter 方法进行注入
我们来看一下,如何通过setter 方法,为Test 类中注入依赖的接口DependentedInterface 实例。 xml 代码如下:
<bean id = "test" class = "xxxxx.Test">
<property name = "deInterface">
<ref bean = "depend"/>
</property>
</bean>
<bean id = "depend" class = "xxx.StaticDependentedInterfaceFactory" factory-method = "getInstance"/>
上面第二个bean 定义中,class 指明了具体的静态工厂方法类,factory-method 指明的是这个静态方法工厂类对应的工厂方法是什么。然后容器就可以根据这个配置,调用指明的静态工厂方法(getInstance),然后返回方法调用后的结果。这样,就可以为Test 类注入DependentedInterfaceImpl 实例了。
通过构造方法进行注入
其实静态工厂方法实现类的类型和类中的工厂方法返回的类型没有必然相同的关系。有些时候,工厂类中的工厂方法,需要根据传入的参数来返回相应的实例,我们就可以使用<constructor-arg> 标签来指定工厂方法需要的参数,现在假如静态工厂方法实现类如下:
public class StaticDependentedInterfaceFactory {
public stastic DependentedInterface getInstance(Depend depend) {
return new DependentedInterfaceImpl(depend);
}
}
类StaticDependentedInterfaceFactory 需要其他依赖来返回某个DependentedInterface 的实现。
这样我们可以通过构造方法中的参数进行注入,需要使用到<constructor-arg> 标签,代码如下:
<bean id = "test" calss = "xxxx.Test">
<property name = "deInterface">
<ref bean = "deInter"/>
</property>
</bean>
<bean id = "deInter" class = "xxxxx.StaticDependentedInterfaceFactory" factory-method = "getInstance">
<constructor-arg>
<ref bean = "depend"/>
</constructor-arg>
</bean>
<bean id = "depend" class = "xxxxxx.Dependented"/>
这里我们需要注意,在上面示例代码第二个bean(静态工厂方法实现类)的定义中,使用<construct-arg> 传入的是工厂方法的参数,而不是静态工厂方法实现类的构造方法的参数。
(其实静态工厂方法实现类也没有提供显示的构造方法。)
总结
这篇文章主要介绍的是如何使用静态工厂方法利用xml 文件进行依赖注入,后续讲如何使用费静态方法。