Bean元信息的解析就是将各种方式定义的bean配置信息解析为BeanDefinition对象。
XML方式解析:XmlBeanDefinitionReaderSpring中提供了一个类XmlBeanDefinitionReader,将xml中定义的bean解析为BeanDefinition对象。
直接来看案例代码。来一个beanxml配置文件:
将beanxml解析为BeanDefinition对象
创建XmlBeanDefinitionReader的时候需要传递一个bean注册器(BeanDefinitionRegistry),解析过程中生成的BeanDefinition会丢到bean注册器中。
运行输出:
这几个BeanDefinition都是GenericBeanDefinition这种类型的,也就是说xml中定义的bean被解析之后都是通过GenericBeanDefinition这种类型表示的。
properties文件定义bean的解析PropertiesBeanDefinitionReader`Spring中提供了一个类XmlBeanDefinitionReader,将properties中定义的bean解析为BeanDefinition对象,过程和xml的方式类似。
下面通过properties文件的方式实现上面xml方式定义的bean。来个properties文件:beans.properties
将beanproperties文件解析为BeanDefinition对象
运行输出:
输出和xml方式输出基本上一致。properties方式使用起来并不是太方便,所以平时很少看到有人使用。
注解方式:AnnotatedBeanDefinitionReader注解的方式定义的bean,需要使用AnnotatedBeanDefinitionReader这个类来进行解析,方式也和上面2种方式类似,直接来看案例。
通过注解来标注2个类,Service1:
这个类上面使用了3个注解来配置bean的信息,上面这个bean是个多例的。
Service2:
标注了
Autowired,说明需要注入这个对象。注解定义的bean解析为BeanDefinition,如下:
运行输出:
输出中可以看出service1这个bean的beanDefinition中lazyInit确实为true,primary也为true,scope为prototype,说明类Service1注解上标注3个注解信息被解析之后放在了beanDefinition中。
注意下:最后一行中的service1为什么为null,不是标注了
Autowired么?调整一下上面的代码,加上下面
1这行代码,如下:再次运行一下,最后一行有值了:
为什么呢?往后看完阶段4到阶段10就明白了。