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的主要内容,如果未能解决你的问题,请参考以下文章