@[TOC] spring解析流程----》 xml+注解
#spring是目前java开发中一个非常重要的框架,基本上目前各种项目都和他有关,spring完美的实现了对象和创建和管理,使得我们的开发人员不用关注对象创建和管理,主需要关注自己的业务实现即可,这样也提高了开发人员的开发效率。所以我们有必要了解spring的基本原理,spring是一个综合性的框架,所以涉及的内容非常多,我会分多篇文章进行介绍spring相关的重要知识点,本篇文章主要从源码讲解spring加载xml和解析注解的实现原理。
part1:BeanDefinition对象
在解析之前,先介绍一个对象:BeanDefinition对象,在spring中,对象的时间,只有一种途径,就是所有对象都是先封装成BeanDefinition对象,然后spring对BeanDefinition进行实例化,所以我们又必要了解这个对象的基本信息,这里主要讲GenericBeanDefinition这个对象:
上面这些属性都是xml,获取注解解析的时候需要填充的信息
(1)、id:Bean 的唯一标识名。它必须是合法的 XMLID,在整个 XML 文档中唯一。
(2)、name:用来为 id 创建一个或多个别名。它可以是任意的字母符合。多个别名之间用逗号或空格分开。
(3)、class:用来定义类的全限定名(包名+类名)。只有子类 Bean 不用定义该属性。
(4)、parent:子类 Bean 定义它所引用它的父类 Bean。这时前面的 class 属性失效。子类 Bean 会继承父类 Bean 的所有属性,子类 Bean 也可以覆盖父类 Bean 的属性。注意:子类 Bean 和父类 Bean 是同一个 Java 类。
(5)、abstract(默认为”false”):用来定义 Bean 是否为抽象 Bean。它表示这个 Bean 将不会被实例化,一般用于父类 Bean,因为父类 Bean 主要是供子类 Bean 继承使用。
(7)、lazy-init(默认为“default”):用来定义这个 Bean 是否实现懒初始化。如果为“true”,它将在 BeanFactory 启动时初始化所有的 SingletonBean。反之,如果为“false”,它只在 Bean 请求时才开始创建 SingletonBean。
(8)、autowire(自动装配,默认为“default”):它定义了 Bean 的自动装载方式。
1、“no”:不使用自动装配功能。
2、“byName”:通过 Bean 的属性名实现自动装配。
3、“byType”:通过 Bean 的类型实现自动装配。
4、“constructor”:类似于 byType,但它是用于构造函数的参数的自动组装。
5、“autodetect”:通过 Bean 类的反省机制(introspection)决定是使用“constructor”还是使用“byType”。
(10)、de