在容器里面,bean定义表示为BeanDefinition对象,包含下列元数据:
一个含有包全称的类名,通常是Bean的实现类。 |
bean行为配置元素,表示bean在容器里面的行为(作用域、生命周期等)。 |
对会用到的别的bean的引用,也称作合作者或依赖。 |
别的配置设置,用于新创建的对象,像连接池的大小、最大连接数等。 |
bean定义属性:
Class |
Name |
Scope |
Constructor arguments |
Properties |
Autowiring mode |
Lazy initialization mode |
Initialization method |
Destruction method |
Bean命名:
在基于xml的配置元数据里,可以使用id或name属性来声明bean标识符。
id属性只能声明一个,不可同名。
name可用于声明bean的别名,可以通过分号、逗号或空格来声明多个值。
id和name不强制要求提供,如果不提供,容器就生成一个不会重复的名字给这个bean。
如果想通过name属性参考别的bean,可以使用ref元素。此时被ref的bean必须提供一个name属性。
bean名称以小写字母开头的驼峰命名法字符串组成。统一命名惯例可以让代码更易读。
在bean定义外的别名,使用alias元素:
<beans>
<alias name="fromName" alias="toName"/>
</beans>
实例化Bean:
bean元素的class属性,
可以通过两种方法中的一种使用class属性:
容器通过反射调用bean的构造器实例化,等价于new操作符; |
比较少用的例子是容器可以调用类的静态工厂方法来生成bean; |
嵌套类名:通过美元符号($)或者点号(.)来分隔。
通过构造器实例化(默认构造器):
<bean id="exampleBean" class="examples.ExampleBean"/>
<bean name="anotherExample" class="examples.ExampleBeanTwo"/>
通过类的静态工厂方法实例化:
<bean id="clientService"
class="examples.ClientService"
factory-method="createInstance"/>
通过一个名叫factory-method的属性来声明工厂方法。
通过别的bean实例的工厂方法:
<bean id="serviceLocator" class="examples.DefaultServiceLocator"/>
<!-- 使用serviceLocator的方法创建的bean -->
<bean id="clientService"
factory-bean="serviceLocator"
factory-method="createClientServiceInstance"/>
使用已经实例化的bean的非静态方法创建一个bean,只要将class属性留空,然后factory-bean和factory-method就可自动调用。
在Spring文档里,factory bean意思是一种bean,通过实例或者静态方法创建对象。
FactoryBean则是实现了FactoryBean接口的bean。
确定bean的运行时类型:
建议通过BeanFactory.getType()调用来确定。