Spring官方文档学习-Bean概述

实例化Bean

bean defininition是创建bean的配方。当被请求时,容器按照名称查找配方并使用该 bean definition封装的元数据配置,创建一个实际的对象。
如果你使用基于XML的元数据配置,你会使用标签的class属性描述对象的类型,class属性(Class是BeanDefinition的一个属性)通常是强制的(除了使用Bean工厂方法的实例化和Bean定义的继承方式进行实例化),你可以选择以下两种方式之一来使用Class属性:

  • 通常的,容器本身通过反射的方式调用bean类的构造方法去构造一个bean对象,等同于使用new操作符构造一个对象;
  • 在比较少的情况下,对于包含一个静态工厂方法的bean类的构造,容器会触发一个静态工厂方法去构造该bean。这个静态工厂方法的返回对象类型可能与该bean的class类型相同或者是另一个class.

内嵌类名称 如果你想为一个内嵌类配置bean定义,你可以使用该内嵌类的二进制名称或者源名称。
例如,你有一个叫做SomeThing的类在com.example包中,SomeThing类中有一个叫做OtherThing的静态内嵌类,此时名称中可以使用
$或者.进行分隔,因此BeanDefinition中的Class属性可以是com.example.SomeThing$OtherThing或者
com.example.SomeThing.OtherThing.

使用构造器进行实例化

当你使用构造器的方式去创建bean时,所有普通的类都可以被Spring使用并保持兼容性。也就是说你开发的bean不需要实现特定的接口,也不需要使用特定的方式进行编码。只需要指定bean类就足够了。然而,根据你的bean所使用的IOC容器的类型,你可能需要一个默认的(空的)构造函数。
Spring容器可以管理任何你希望它管理的类。并不局限于管理JavaBean,大多数Spring的使用者认为真正的JavaBean仅有一个无参数的构造器和一些根据容器中的属性建模的getter和setter,你的容器中可以定义更多非bean风格的外来类,例如你需要使用一个完全不符合JavaBean规范的连接池,Spring也可以对其进行很好的管理。
对于基于XML的元数据配置,你可以通过一下方式描述bean:

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

对于有参数的构造函数以及对象被构造后进行属性值的设置,可参考依赖注入一节。

使用静态的工厂方法进行实例化

当定义了一个bean使用静态工厂方法去创建时,使用class属性去指定包含静态工厂方法的类,然后再使用factory-method去指定工厂方法的名称gai dz你应该能够调用该方法(带有可选参数的方法稍后再描述)返回一个活动对象,该对象随后会被当作是通过构造函数创建的。这样的BeanDefinition被称之为静态工厂。
下面的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对象的非静态方法创建一个bean,使用这种机制时,不设置class属性,在factory-bean属性中指出当前(父容器或者祖先容器)bean容器中包含用于触发对象创建的实例化方法的bean名称,设置factory-name属性为工厂方法的名称。下面的例子展示了如何配置这样一个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"/>

在Spring文档中,“factory bean”是指配置在Spring容器中的bean,用于实例或者静态工厂方法创建对象时使用。相比之下,FactoryBean是指Spring中FactoryBean接口的实现类。

确定Bean的运行时类型

确定Bean的运行时类型非常重要。Bean元数据定义中指定的类型只是一个初始类引用,也可能与声明的工厂方法结合在一起,或者是一个FactoryBean类,它会生成不同的运行时类型,或者在实例级bean工厂方法下根本不设置。另外,AOP代理可以基于接口包装bean实例,该代理限制对目标bean实际类型的暴露(仅公开其实现接口)。
找到特定bean类型的推荐方式是使用BeanFactory,指定bean名称情况下的getType()方法调用。这将考虑上述所有情况,使用BeanFactory的getBean()方法传入bean名称返回bean类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值