文档章节

7.3.2 Instantiating beans(实例化beans)

cdc85
 cdc85
发布于 2017/08/23 14:31
字数 1132
阅读 17
收藏 0

    bean定义本质上是创建一个或多个对象的配方.当询问时,容器会查看命名bean的配方,并使用由该bean定义封装的配置元数据创建(或获取)实际对象。如果您使用基于XML的配置元数据,您可以在<bean />元素的类属性中指定要实例化的对象的类型(或类)。这个类属性在内部是BeanDefinition实例上的一个Class属性,通常是必需的。(有关异常,请参见“实例化实例工厂方法”一节和第7.7节“Bean定义继承”一节。)您可以通过以下两种方式之一使用Class属性:

    (1)通常,指定要在容器本身通过反复地调用其构造函数直接创建bean的情况下构造的bean类,这与使用new 操作符的Java代码相当。

    (2)要指定一个包含将要调用以创建对象的静态工厂方法的实际类,在容器调用类创建bean的静态工厂方法的情况较少的情况下。从调用静态工厂方法返回的对象类型可能完全是同一个类或另一个类。

实例化与构造函数

    当通过构造函数方法创建一个bean时,所有普通类都可以使用并与Spring兼容。也就是说,正在开发的类不需要实现任何特定的接口或以特定方式编码。只需指定bean类即可。但是,根据特定bean使用的IoC类型,您可能需要一个默认(空)构造函数。

    Spring IoC容器几乎可以管理您想要管理的任何类;它不限于管理真正的JavaBeans.大多数Spring用户喜欢实际的JavaBean,只有默认(无参数)构造函数和容器中的属性之后建立适当的setter和getter。您还可以在容器中拥有更多异国情调的非Bean风格的类。​​​​​​​例如,如果您需要使用绝对不遵守JavaBean规范的旧版连接池,那么Spring也可以管理它。​​​​​​​

使用静态工厂方法实例化(Instantiation with a static factory method​​​​​​​)

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

    ​​​​​​​以下bean定义指定将通过调用工厂方法创建该bean。​​​​​​​定义没有指定返回对象的类型(class),只指定了包含工厂方法的类。在这个例子中,createInstance()方法必须是静态方法。​​​​​​​

<bean id="clientService"
    class="examples.ClientService"
    factory-method="createInstance"/>
public class ClientService {
    private static ClientService clientService = new ClientService();
    private ClientService() {}

    public static ClientService createInstance() {
        return clientService;
    }
}

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

实例化使用实例工厂方法(Instantiation using an instance factory method)

    与通过静态工厂方法的实例化类似,使用实例工厂方法实例化从容器调用现有bean的非静态方法来创建新bean。要使用此机制,请将类属性保留为空,并在 factory-bean 属性中指定包含要调用以创建对象的实例方法的当前(或parent/ancestor(父/祖先))容器中的bean的名称。使用 factory-method 属性设置工厂方法本身的名称。

<!-- 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"/>
public class DefaultServiceLocator {

    private static ClientService clientService = new ClientServiceImpl();
    private DefaultServiceLocator() {}

    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"/>
public class DefaultServiceLocator {

    private static ClientService clientService = new ClientServiceImpl();
    private static AccountService accountService = new AccountServiceImpl();

    private DefaultServiceLocator() {}

    public ClientService createClientServiceInstance() {
        return clientService;
    }

    public AccountService createAccountServiceInstance() {
        return accountService;
    }

}

note:  

在Spring文档中,工厂bean(factory bean )是指通过实例或静态工厂方法创建对象的Spring容器中配置的bean。FactoryBean(注意大写)是指Spring特定的FactoryBean。

© 著作权归作者所有

cdc85
粉丝 0
博文 38
码字总数 17429
作品 0
福州
私信 提问
【Spring】- Bean懒加载机制

Bean类型:singleton/prototype singleton Bean:单例Bean,Bean在使用过程中只实例化1次(默认) prototype Bean:原型Bean, Bean每次使用都实例化新的对象 IOC容器Bean初始化 ①:单例Bean:I...

ZeroneLove
03/02
12
0
Spring框架参考手册_5.0.0_中英文对照版_Part II_3.2

文章作者:Tyan 博客:noahsnail.com 3.2 Container overview The interface represents the Spring IoC container and is responsible for instantiating, configuring, and assembling th......

Quincuntial
2016/09/12
0
0
Spring框架参考手册_5.0.0_中英文对照版_Part II_3.3

文章作者:Tyan 博客:[noahsnail.com](http://noahsnail.com 3.3 Bean overview A Spring IoC container manages one or more beans. These beans are created with the configuration met......

Quincuntial
2016/09/17
0
0
Spring框架参考手册_5.0.0_中文版_Part II_3.3

文章作者:Tyan 博客:[noahsnail.com](http://noahsnail.com 3.3 Bean概述 Spring IoC容器管理一个或多个beans。这些beans由提供给容器的配置元数据生成,例如,XML形式的定义。 在容器本身...

Quincuntial
2016/09/17
0
0
搭建与测试Spring开发环境

1、Spring需要的jar 到http://www.springsource.org/download下载spring,然后进行解压缩,在解压目录中找到下面jar文件,拷贝到类路径下。 spring.jar commons-logging.jar 如果使用了切面编...

罗荣熙
2012/09/27
275
0

没有更多内容

加载失败,请刷新页面

加载更多

python学习10.04:Python list列表使用技巧及注意事项

前面章节介绍了很多关于 list 列表的操作函数,细心的读者可能会发现,有很多操作函数的功能非常相似。例如,增加元素功能的函数有 append() 和 extend(),删除元素功能的有 clear()、 remo...

太空堡垒185
34分钟前
4
0
新手插画学习的方法?教你如何自学?

插画学习的方法?教你如何自学? 从小喜欢画一些漫画头像随笔画,但是其实没有基础。个人偏好小清新手绘风的插画(如下图),每每看到都希望自己能画出这样的作品。 我其实很想说画这种美术功...

huihuajiaocheng
40分钟前
5
0
面试总结

一、2019.10.15日上午交子大道中海国际艾迪泰科面试总结 1、领导比较有亲合力,就是办公环境没有隔挡,不是很喜欢办公环境 2、成都这边人员太少,感觉不到规模 3、离家太远 1、实现clone(); ...

gtandsn
51分钟前
5
0
CentOS 7 部署 tesseract-ocr

官方地址 github yum-config-manager --add-repo https://download.opensuse.org/repositories/home:/Alexander_Pozdnyakov/CentOS_7/ 若提示 yum-config-manager: command not found 执行以......

阿白
51分钟前
3
0
JAVA比较器中comparator的使用

一个专用的比较器Comparator Comparator是一个专用的比较器,当一个不支持自比较或者自比较函数不能满足要求时,可写一个比较器来完成两个对象之间大小的比较。Comparator体现了一种策略模式...

daxiongdi
52分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部