spring-framework-reference(5.1.1.RELEASE)中文版——Core部分 (5)

在不太常见的情况下,在容器调用类上的静态工厂方法来创建bean时,指定包含用于创建对象的静态工厂方法的实际类。从静态工厂方法调用返回的对象类型可能完全是同一个类或另一个类。

Inner class names
如果要为静态嵌套类配置bean定义,则必须使用嵌套类的二进制名称。

例如,如果在com.example中有一个名为SomeThing的类。这个SomeThing类有一个名为OtherThing的静态嵌套类,bean定义上的class属性的值应该是com.example.SomeThing$OtherThing。

注意,在名称中使用$字符将嵌套类名称与外部类名称分隔开来。

Instantiation with a Constructor

当您使用构造函数方法创建bean时,所有普通类都可以使用,并且与Spring兼容。也就是说,正在开发的类不需要实现任何特定的接口或以特定的方式进行编码。简单地指定bean类就足够了。然而,根据对特定bean使用的IoC类型的不同,您可能需要一个默认(空)构造函数

Spring IoC容器实际上可以管理您希望它管理的任何类。它不限于管理真正的JavaBeans。大多数Spring用户更喜欢实际的javaBeans,只有一个默认的(无参数的)构造函数,以及根据容器中的属性建模的适当的setter和getter。您还可以在容器中拥有更多具有外来的非bean风格的类。例如,如果您需要使用一个完全不遵守JavaBean规范的遗留连接池,Spring也可以对其进行管理。

使用基于xml的配置元数据,您可以如下所示指定bean类:

<bean/> <bean/>

有关向构造函数提供参数(如果需要)和在构造对象之后设置对象实例属性的机制的详细信息,请参见注入依赖项。

Instantiation with a Static Factory Method

在定义使用静态工厂方法创建的bean时,使用class属性指定包含静态工厂方法的类和名为factory-method的属性来指定工厂方法本身的名称。您应该能够调用这个方法(使用可选参数,稍后将进行描述),并返回一个活动对象,该对象随后将被视为通过构造函数创建的对象。这种bean定义的一种用法是在遗留代码中调用静态工厂。

下面的bean定义指定通过调用工厂方法创建bean。定义没有指定返回对象的类型(类),只指定包含工厂方法的类。在本例中,createInstance()方法必须是一个静态方法。下面的例子展示了如何指定工厂方法:

<bean factory-method="createInstance"/>

下面的示例显示了一个将与前面的bean定义一起工作的类:

public class ClientService { private static ClientService clientService = new ClientService(); private ClientService() {} public static ClientService createInstance() { return clientService; } }

有关向工厂方法提供(可选的)参数以及在从工厂返回对象后设置对象实例属性的机制的详细信息,请参阅依赖项和配置的详细信息。

Instantiation by Using an Instance Factory Method

与通过静态工厂方法实例化类似,使用实例工厂方法实例化从容器调用现有bean的非静态方法来创建新的bean。要使用这种机制,请保持类属性为空,并在factory-bean属性中指定当前(或父或祖先)容器中的bean的名称,该容器包含要调用来创建对象的实例方法。使用工厂方法属性设置工厂方法本身的名称。下面的示例展示了如何配置这样的bean:

<!-- the factory bean, which contains a method called createInstance() --> <bean> <!-- inject any dependencies required by this locator bean --> </bean> <!-- the bean to be created via the factory bean --> <bean factory-bean="serviceLocator" factory-method="createClientServiceInstance"/>

下面的例子显示了相应的Java类:

public class DefaultServiceLocator { private static ClientService clientService = new ClientServiceImpl(); public ClientService createClientServiceInstance() { return clientService; } }

一个工厂类也可以容纳多个工厂方法,如下例所示:

<bean> <!-- inject any dependencies required by this locator bean --> </bean> <bean factory-bean="serviceLocator" factory-method="createClientServiceInstance"/> <bean factory-bean="serviceLocator" factory-method="createAccountServiceInstance"/>

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

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