Spring 入门学习 —— XML 格式文件介绍(十六)(工厂方法与FactoryBean [4])

93 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情

上一篇文章我们介绍了怎么使用xml 以静态工厂方法的方式进行bean 的依赖注入和依赖关系绑定。这篇文章我们介绍如何使用非静态工厂方法来完成上述内容。

使用非静态工厂方法在xml 中进行bean 的注册和依赖绑定

通过上一篇文章我们知道,可以通过静态工厂方法的实现类中的方法的调用的结果作为bean 注册到容器中,相同的道理,我们自然会想到,应该同样可以使用非静态工厂方法完成相同的功能。当然,表达方式肯定需要改变一下。

首先我们定义一个非静态工厂方法实现类,如下:

public class NonStaticDependentedInterfaceFactory {
    public DependentInterface getInstance() {
        return new DependentedInterfaceImpl();
    }
}

我们发现,工厂方是一个非静态方法,所以在java 的使用过程中,我们都知道,想要调用这个方法,就要有一个类NonStaticDependentedInterfaceFactory 的实例来调用这个非静态工厂方法。但是在spirng 中是容器进行调用,于是就应该是这种配置信息:

<bean id = "test" class = "xxxxxxx.Test">
    <property name = "dependentInterface">
        <ref bean = "dependent"/>
    </property>
</bean>

<bean id = "factory" class = "xxxxx.NonStaticDependentedInterfaceFactory"/>
<bean id = "dependent" factory-bean = "factory" factory-method = "getInstance"/>

从上面的文字中我们可以知道,NonStaticDependentedInterfaceFactory 类是作为一个正常的bean 注册到容器中的。但是对于dependent 的定义却是和上文所述的静态工厂方法中的实例有所不同。

如果我们还记得上一篇文章中的内容我们就可以很清晰地看出区别,这种使用非静态工厂方法的实现方式是使用factory-bean 属性标签来指定这个工厂方法所在的工厂类实例(在静态工厂方法的实现方式中,是使用class 属性标签来指定工厂方法所在类的类型);对于指定工厂方法名的方式则相同,都是通过factory-method 属性标签来完成的。

另外需要说的是,如果使用非静态工厂方法的实现方式实现带参数的工厂方法的时候,处理方式和静态工厂方法类似,即都可以通过<construct-arg> 标签来完成。

总结

这篇文章我们介绍了另外一种使用非静态工厂方法在xml 中进行bean 的注册和依赖绑定的方式。下一篇文章我们来介绍FactoryBean 是什么。