实例化Bean
bean定义基本上就是用来创建一个或多个对象的配置,当需要bean的时候,容器会查找配置并且根据bean定义封装的元数据来创建(或获取)实际对象。
如果你使用基于XML的配置,那么可以在 元素中通过 class属性来指定对象类型。 class属性实际上就是BeanDefinition实例中的class属性。他通常是必需
的。有两种方式使用Class属性。
通常情况下,会直接通过反射调用构造方法来创建bean,这种方式与Java代码的new创建相似。
通过静态工厂方法创建,类中包含静态方法。通过调用静态方法返回对象的类型可能和Class一样,也可能完全不一样。
内部类名
如果你想配置静态内部类,那么必须使用内部类的二进制名称。
例如,在com.example有个SomeThing类,这个类里面有个静态内部类OtherThing,这种情况下bean定义的class属性应该写
作 com.example.SomeThing$OtherThing.
使用$字符来分隔外部类和内部类的名称
使用构造器实例化
当您通过构造方法创建bean时,所有普通类都可以使用并与Spring兼容。也就是说,正在开发的类不需要实现任何特定接口或以特定方式编码。 只要
指定bean类就足够了。但是,根据您为该特定bean使用的IoC类型,您可能需要一个默认(空)构造函数。
Spring IoC容器几乎可以管理您希望它管理的任何类。它不仅限于管理真正的JavaBeans。大多数Spring用户更喜欢管理那些只有一个默认构造函数
(无参数) 和有合适的setter和getter方法的真实的JavaBeans,还可以在容器中放置更多的外部非bean形式(non-bean-style)类,例如:如果需要使用一
个绝对违反JavaBean规范的遗留连接池时 Spring也是可以管理它的。
使用基于XML的配置元数据,您可以按如下方式指定bean类:
<bean id="exampleBean" class="examples.ExampleBean"/>
<bean name="anotherExample" class="examples.ExampleBeanTwo"/>
使用静态工厂方法实例化
当采用静态工厂方法创建bean时,除了需要指定class属性外,还需要通过factory-method 属性来指定创建bean实例的工厂方法。 Spring将会调用此
方法(其可选参数接下来会介绍)返回实例对象。从这样看来,它与通过普通构造器创建类实例没什么两样。
下面的bean定义展示了如何通过工厂方法来创建bean实例。注意,此定义并未指定对象的返回类型,只是指定了该类包含的工厂方法,在这个例
中, createInstance()必须是一个静态(static)的方法。
<bean id="clientService"
class="examples.ClientService"
factory-method="createInstance"/>
以下示例显示了一个可以使用前面的bean定义的类:
public class ClientService {
private static ClientService clientService = new ClientService();
private ClientService() {}
public static ClientService createInstance() {
return clientService;
}
}
使用实例工厂方法实例化
通过调用工厂实例的非静态方法进行实例化与通过静态工厂方法实例化类似, 要使用此机制,请将class属性保留为空,并在factory-bean属性中指定
当前(或父级或祖先)容器中bean的名称,该容器包含要调用以创建对象的实例方法。 使用factory-method属性设置工厂方法本身的名称。以下示例显示
如何配置此类bean:
<!-- the factory bean, which contains a method called createInstance() -->
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
<!-- inject any dependencies required by this locator bean -->
</bean>
<!-- the bean to be created via the factory bean -->
<bean id="clientService"
factory-bean="serviceLocator"
factory-method="createClientServiceInstance"/>
以下示例显示了相应的Java类:
public class DefaultServiceLocator {
private static ClientService clientService = new ClientServiceImpl();
public ClientService createClientServiceInstance() {
return clientService;
}
}
一个工厂类也可以包含多个工厂方法,如以下示例所示:
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
<!-- inject any dependencies required by this locator bean -->
</bean>
<bean id="clientService"
factory-bean="serviceLocator"
factory-method="createClientServiceInstance"/>
<bean id="accountService"
factory-bean="serviceLocator"
factory-method="createAccountServiceInstance"/>
以下示例显示了相应的Java类:
public class DefaultServiceLocator {
private static ClientService clientService = new ClientServiceImpl();
private static AccountService accountService = new AccountServiceImpl();
public ClientService createClientServiceInstance() {
return clientService;
}
public AccountService createAccountServiceInstance() {
return accountService;
}
}
这种方法表明可以通过依赖注入(DI)来管理和配置工厂bean本身。
在Spring文档中,“factory bean”是指在Spring容器中配置并通过实例 或 静态工厂方法 创建对象的bean。相比之下,FactoryBean(注意大小写)是指Spring特定的FactoryBean。