Bean以及bean的实例化

故事扮演 提交于 2020-02-05 02:14:14

什么是bean

bean就是IoC容器托管的对象。

引用自官方文档
In addition to bean definitions that contain information on how to create a specific bean, the ApplicationContext implementations also permit the registration of existing objects that are created outside the container (by users). This is done by accessing the ApplicationContext’s BeanFactory through the getBeanFactory() method, which returns the BeanFactory DefaultListableBeanFactory implementation. DefaultListableBeanFactory supports this registration through the registerSingleton(..) and registerBeanDefinition(..) methods. However, typical applications work solely with beans defined through regular bean definition metadata.

注:除了IoC容器根据配置元数据创建的bean之外,还可以将容器外创建的对象注册到IoC容器中。

Bean的配置元数据拥有的属性

Property
Class
Name
Scope
Constructor arguments
Properties
Autowiring mode
Lazy initialization mode
Initialization method
Destruction method

1.给Bean命名

每个bean可以有多个名字,但是每个名字只对应一个bean。每个名字都是唯一的。

可以通过bean标签中的id和name方法给bean命名。每个bean仅有一个id,但可以有多个name。

<bean id="inte" class="java.lang.Object" name="num,number"/>

上面这个例子,这个bean现在有3个名字,inte、num和number。

在bean标签外定义别名:

除了上面提到的在bean标签中通过id和name属性命名的方式,还可以使用alias标签定义别名。

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

官方文档解释:一个大型的系统由一些子系统组成,多个子系统可能使用同样的bean,但不能保证每个子系统都使用同样的名字,使用这个标签就可以解决这个问题。

2.实例化bean

一个bean的配置信息,本质上是一个创建对象的“配方”。

在bean标签中有一个class属性,用来指定bean的具体类型(全限定类名:包名 + 类名)。对于被static修饰的内部类来说,它的全限定是:外部类全限定类名$内部类名。

class属性的两种使用方式:

  • IoC容器通过反射调用这个类的构造器,实例化一个bean。
  • 通过该类的静态工厂方法实例化一个bean。

通过构造器实例化:

构造器分为有参数的构造器和没有参数的构造器。同样,通过构造器实例化时,也可以使用无参的构造器和有参的构造器。对于有参数的构造器,放在后面的依赖注入部分了解。这里主要介绍使用无参构造实例化。

注:要被实例化的类一定要有无参构造方法

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

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

通过静态工厂方法实例化:
通过class属性可以指定要初始化的类,如果这个类有静态工厂方法,并且要使用这个静态工厂方法实例化这个类,可以给bean标签添加另一个属性 factory-method 指定要调用的静态工厂方法的方法名(当然,静态工厂方法也可以有参数,同样对于有参数的工厂方法在依赖注入的地方介绍)

<bean id="clientService"
    class="examples.ClientService"
    factory-method="createInstance"/>

上面的这个例子说明examples.ClientService这个类中一定有一个静态工厂方法createInstance()

通过实例工厂方法实例化:
对于实例工厂来说,它本身也是个bean,所以,实例工厂也要在配置元数据中定义。

通过factory-bean指定实例工厂。

通过factory-method指定要调用的工厂方法。

注:与静态工厂方法不同,静态工厂方法需要通过类名进行限定;对于实例工厂来说,需要知道实例工厂是哪个,以及调用这个工厂的哪个方法。也就是说,如果使用实例工厂方法初始化bean,不需要指定class属性

<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"/>

对于一个实例工厂来说,可能有多个工厂方法,只需要在factory-method指定方法名即可。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!