Spring官方文档阅读(二)之Bean的简单理解与使用

1.3.Bean简介

Spring IoC容器管理一个或多个bean,这些bean是使用我们提供给容器的配置元数据创建的(例如,以XML<bean//>定义的形式 ),在容器本身内,这些bean定义表示BeanDefinition对象,这个对象包含了以下元数据

  • 类名称:通常,定义了Bean的实际实现类(一个class类)。
  • Bean行为配置元素,用于声明Bean在容器中的行为方式(作用域,生命周期回调等)。
  • 对其他bean进行工作所需的引用。这些引用也称为协作者或依赖项。
  • 要在新创建的对象中设置的其他配置设置-例如,池的大小限制或在管理连接池的bean中使用的连接数。

如果要创建一些没有特定信息的Bean,那么ApplicationContext允许用户在容器外部自己创建对象,通过一些方法将这个类注册成Bean。就是通过方法访问ApplicationContext的BeanFactory来完成的 调用方法为getBeanFactory(),该方法返回类型为DefaultListableBeanFactory的BeanFactory对象。BeanFactory 通过registerSingleton(…)和 registerBeanDefinition(…)方法支持此注册。

1.3.1.Bean的命名

每个bean具有一个或多个标识符,这些标识符在当前Bean所在容器内必须唯一。

//id,name中的字符串都可以表示为这个bean的标识符
<bean id="..." name="..." class="...">
        <!-- collaborators and configuration for this bean go here -->
</bean>

一个bean通常只有一个标识符。但是,如果需要多个,则可以将其他多余的标识视为别名。
在XML配置文件中,可以使用name和id两个属性来当作bean的标识符,它们可以包含特殊字符。
Bean取别名
如果要为bean引入别名,那么可以在name属性中,用逗号,,分号;,或空格来分隔

<bean name="name1,name2,name3" class="...">
        <!-- collaborators and configuration for this bean go here -->
</bean>

这样name1,name2,name3都是该bean的标识符

在spring3.1前,id属性是xsd:ID类型,3.1之后,id属性为xsd:string类型,字符不再受到限制
Bean ID唯一性尽管不再由XML解析器执行,但容器还是会强制执行。
如果没有为Bean取名
如果外面没有为bean提供name和id,容器将为这个bean生成一个唯一的名称,但是,其他bean如果要引用该bean的话,那么必须提供一个名称,让调用bean通过ref元素或者服务定位器样式查找

Bean的命名规则采用首字母小写的驼峰式大小写
如果有多个字符,并且第一个第二个都是大写,那么将会被保留

在定义这个bean的外部使用别名

<alias name="fromName" alias="toName"/>

在引用这个bean的xml文件中,使用alias标签,将name为fromName的bean,取别名为toName

1.3.2.实例化Bean

当我们在一个Class中需要使用Bean,那么我们就要对Bean进行实例化,相当于new一个对象
方法1:构造函数实例化
当你通过构造方法创建出一个bean,那么所有的普通类都能够通过spring使用和依赖这个bean;总而言之,使用的类不需要实现接口或者以特定的方式进行编码,只需要与这个bean相依赖就可以了,但是,根据您用于该特定bean的IoC的类型,您可能需要一个默认(空)构造函数
基于XML的配置元数据,可以这样指定bean类

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

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

方法2:静态工厂方法实例化
bean标签中,factory-method属性,来指定这个方法(方法必须是在class中,且方法是static所修饰的),方法返回一个对象,这个bean将会被认为是通过构造函数创建
例子如下:

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

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

方法三:实例工厂方法实例化
会从容器中调用现有bean的非静态方法来创建新的bean
注意:要将bean的class属性留空,并在factory-bean属性中表明要创建该对象的实例方法的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();

    public ClientService createClientServiceInstance() {
        return clientService;
    }
}

备注:在spring中,factory bean是指spring容器中配置并通过实例和静态工厂方法创建对象的bean
Factory是指特定的Spring的FactoryBean实现类

确定一个bean实例化时的类型
方法1:BeanFactory.getType(String name)来获取到这个bean的类型(官方推荐)
方法2:BeanFactory.getBean获得到整个bean对象

总结:

bean的介绍,如何为bean命名取别名,bean被Spring包装成beanDefinition对象,当Class使用到一个bean时,如何对bean进行实例化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值