Spring Ioc容器 - 2

Posted 天堂1223

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Ioc容器 - 2相关的知识,希望对你有一定的参考价值。

接着从Spring Ioc容器继续学习Spring的知识。

内部类名

如果你想要为一个static嵌套类配置一个bean定义,你必须使用嵌套类的二进制名称。
例如,如果在包com.example中有一个名字为SomeThing的类,并且这个SomeThing类有一个static的名称为OtherThing的嵌套类,
在bean定义上的class属性应该为com.example.SomeThing$OtherThing。
注意,在名称中使用$来从外部类名称中分离嵌套类。

使用构造器初始化

当你使用构造器创建一个bean的时候,在Spring中,所有正常的类都是可用的并且兼容的。也就是说,正在开发的类不需要实现任何特定的接口或以不同的形式编码。仅仅是指定bean类应该就足够了。然而,依赖于为那个指定的bean你所使用的IoC的类型,你可能需要一个默认(空的)的构造器。

实际上,Spring IoC容器能够管理你想要它管理的所有的类。他不被限制管理真正的Java Bean。大多数Spring用户更喜欢仅带有一个默认(没有参数)构造器的Javabean,并且在容器内的属性后面又正确的Setters和getters函数。您还可以在容器中拥有更多异域风情的非bean风格类。例如,如果你需要使用一个完全没有任何Javabean指定的旧连接池,Spring也可以管理他。

使用基于XML的配置元数据,你可以向下述一样指定你的bean:

bean id="exampleBean" class="examples.ExampleBean"/>

<bean name="anotherExample" class="examples.ExampleBeanTwo"/>

使用静态工厂方法实例化

当你是用一个静态工厂方法定义一个bean的时候,使用class属性来指定包含static工厂方法和一个名称为factory-method的类来指定工厂方法本身的名称。你应该能够调用这个方法(使用可选的参数)然后返回一个对象,它随后被视为是通过构造函数创建的。这样bean定义的使用在传统编码中被称为static工厂。

下面的bean定义指定了通过调用工厂方法创建的bean。该定义并不指定返回对象的类型,仅仅指定包含工厂方法的类。在这个例子中,createInstance()方法一定是一个静态方法。下面的例子展示了如何指定一个工厂方法。

<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;
	

通过使用一个实例工厂方法实例化

和通过一个静态工厂方法实例化相似,使用一个实例工厂方法实例化调用一个来自容器的存在的bean中的非静态方法来创建一个新的bean。为了使用这个机制,需要将class属性置空,并且在factory-bean属性中,指定在容器中包含要被调用来创建对象的的实例方法的bean名称。使用factory-method属性来设置工厂方法本身的名称。下述示例展示了如何去配置这样一个bean:

<!-- 工厂bean,包含一个createInstance()的方法 -->
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
<!-- 注入任何被这个定位Bean需要的依赖 -->
</bean>

<!-- 通过工厂bean创建的bean -->
<bean id="clientService"
	factory-bean="serviceLocator"
	factory-method="createClientServiceInstance" />

下面的例子展示了相应的类:

public class DefaultServiceLocator

	private static ClientService clientService = new ClientServiceImpl();

	public ClientService createClientServiceInstance()
		return clientService;
	

一个工厂类可以持有多个工厂方法,就像下面的例子展示的那样:

<bean id="serviceLocator" class="examples.DefaultServiceLocator">
<!-- 注入serviceLocator需要的依赖 -->
</bean>

<bean id="clientService"
	factort-bean="serviceLocator"
	factory-method="createClientServiceInstance">
</bean>

<bean id="accountService"
	factory-bean="serviceLocator"
	factory-method="createAccountServiceInstance"/>

下面的例子展示了相应的类:

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;
	

这种方式展示了,工厂bean本身可以通过依开依赖注入被管理和配置。

在Spring文档中,"factory bean"指的是在Spring容器中被配置的,并且通过实例或工厂方法创建对象的bean,相对比的,"FactoryBean"值得是Spring特定的FactoryBean的实现类。

决定一个Bean的运行时类型

一个特定的bean的运行时类型时很难确定的。在bean元数据定义中的特定的类仅仅是一个初始类的引用,并且有可能和一个声明的工厂方法或一个BeanFactory类相关联,该工厂方法或BeanFactory类可能会引导这个bean为一个不同的运行时类型,或者是在实例级工厂方法的情况下根本不设置(而是通过指定的factory-name名称来解决这个问题)。AOP代理可以用一个基于接口的代理来包装一个bean实例,并限制目标bean的实际类型的公开(仅仅他的实现接口)。

获取一个特定bean的实际的运行时类型比较推荐的方法就是使用BeanFactory的getType方法。该调用会把上述所有的情况都考虑在内并且返回一个对象的类型。

以上是关于Spring Ioc容器 - 2的主要内容,如果未能解决你的问题,请参考以下文章

Spring(02)重新认识 IoC

3.Spring系列之IOC&DI

对spring IOC容器DI的理解

Spring之IOC

Spring IOC 学习总结

Spring ioc容器