返回

Spring5源码3-BeanDefinition

发布时间:2023-10-30 09:01:21 116

1. BeanDefinition

BeanDefinition在spring中贯穿始终,spring要​​根据BeanDefinition对象来实例化bean​​,只有把解析的标签,扫描的注解类封装成BeanDefinition对象,spring才能实例化bean

Spring5源码3-BeanDefinition_spring

beanDefinition主要实现类:

  • ChildBeanDefinition
  • GenericBeanDefinition
  • RootBeanDefinition

2. ChildBeanDefinition

ChildBeanDefinition 是一种 BeanDefinition,它可以继承它父类的设置,即 ChildBeanDefinition 对 RootBeanDefinition 有一定的依赖关系。

ChildBeanDefinition 从父类继承构造参数值,属性值并可以重写父类的方法,同时也可以增加新的属性或者方法。(类同于 java 类的继承关系)。若指定初始化方法,销毁方法或者静态工厂方法,ChildBeanDefinition 将重写相应父类的设置。 depends on,autowire mode,dependency check,singleton,lazy init 一般由子类 自行设定。

3. GenericBeanDefinition

从 spring 2.5 开始,提供了一个更好的注册 BeanDefinition 类 GenericBeanDefinition,它支持动态定义父依赖,方法是 GenericBeanDefinition.setParentName(java.lang.String),GenericBeanDefinition 可以有效的替代 ChildBeanDefinition 的绝大分部使用场合。

GenericBeanDefinition 是一站式的标准 BeanDefinition,除了有指定类、可选的构造参数值和属性参数这些其它 BeanDefinition 也有的特性外,它还具有通过 parenetName 属性来灵活设置 parent BeanDefinition。

通常, GenericBeanDefinition 用来注册用户可见的 BeanDefinition(可见的 BeanDefinition 意味着可以在该类 BeanDefinition 上定义 post-processor 来对 bean 进行操作,甚至为配置 parent name 做扩展准备)。RootBeanDefinition / ChildBeanDefinition 用来预定义具有 parent/child 关系的 BeanDefinition。

4. RootBeanDefinition

一个 RootBeanDefinition 定义表明它是一个可合并的 BeanDefinition:即在 spring beanFactory 运行期间,可以返回一个特定的 bean。RootBeanDefinition 可以作为一个重要的通用的 BeanDefinition 视图。

RootBeanDefinition 用来在配置阶段进行注册 BeanDefinition。然后,从 spring 2.5 后,编写注册 BeanDefinition 有了更好的的方法:GenericBeanDefinition。 GenericBeanDefinition 支持动态定义父类依赖,而非硬编码作为 root BeanDefinition。

5. GenericBeanDefinition创建实例

创建实体类UserClass

public class UserClass {

private String username;

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}
}

创建实现类BeanDefinitionTest,实现BeanDefinitionRegistryPostProcessor接口

@Component
public class BeanDefinitionTest implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
genericBeanDefinition.setBeanClass(UserClass.class);
MutablePropertyValues propertyValues = genericBeanDefinition.getPropertyValues();
propertyValues.addPropertyValue("username", "fisher");
registry.registerBeanDefinition("UserClass", genericBeanDefinition);
}

@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

}

}

测试方法

public void test3() {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext("spring.xml");
UserClass userClass = (UserClass)applicationContext.getBean("UserClass");
System.out.println("UserClass-->" + userClass.getUsername());
}

查看打印


Spring5源码3-BeanDefinition_父类_02

6. BeanDefinition中的属性

Spring5源码3-BeanDefinition_父类_03

  • (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继承使用。
  • (6)singleton(默认为true):定义Bean是否是Singleton(单例)。如果设为“true”,则在BeanFactory作用范围内,只维护此Bean的一个实例。如果设为“flase”,Bean将是Prototype(原型)状态,BeanFactory将为每次Bean请求创建一个新的Bean实例。
  • (7)lazy-init(默认为“default”):用来定义这个Bean是否实现懒初始化。如果为“true”,它将在BeanFactory启动时初始化所有的SingletonBean。反之,如果为“false”,它只在Bean请求时才开始创建SingletonBean。
  • (8)autowire(自动装配,默认为“default”):它定义了Bean的自动装载方式。
  • ​no​​:不使用自动装配功能。
  • ​byName​​:通过Bean的属性名实现自动装配。
  • ​byType​​:通过Bean的类型实现自动装配。
  • ​constructor​​:类似于byType,但它是用于构造函数的参数的自动组装。
  • ​autodetect​​:通过Bean类的反省机制(introspection)决定是使用“constructor”还是使用“byType”。
  • (9)dependency-check(依赖检查,默认为“default”):它用来确保Bean组件通过JavaBean描述的所以依赖关系都得到满足。在与自动装配功能一起使用时,它特别有用。
  • ​none​​:不进行依赖检查。
  • ​objects​​:只做对象间依赖的检查。
  • ​simple​​:只做原始类型和String类型依赖的检查
  • ​all​​:对所有类型的依赖进行检查。它包括了前面的objects和simple。
  • (10)depends-on(依赖对象):这个Bean在初始化时依赖的对象,这个对象会在这个Bean初始化之前创建。
  • (11)init-method:用来定义Bean的初始化方法,它会在Bean组装之后调用。它必须是一个无参数的方法。
  • (12)destroy-method:用来定义Bean的销毁方法,它在BeanFactory关闭时调用。同样,它也必须是一个无参数的方法。它只能应用于singletonBean。
  • (13)factory-method:定义创建该Bean对象的工厂方法。它用于下面的“factory-bean”,表示这个Bean是通过工厂方法创建。此时,“class”属性失效。
  • (14)factory-bean:定义创建该Bean对象的工厂类。如果使用了“factory-bean”则“class”属性失效。
  • (15)autowire-candidate:采用xml格式配置bean时,将元素的autowire-candidate属性设置为false,这样容器在查找自动装配对象时,将不考虑该bean,即它不会被考虑作为其它bean自动装配的候选者,但是该bean本身还是可以使用自动装配来注入其它bean的。
  • (16)MutablePropertyValues:用于封装< property>标签的信息,其实类里面就是有一个 list,list 里面是 PropertyValue 对象,PropertyValue 就是一个 name 和 value 属性,用于封装< property>标签 的名称和值信息 。
  • (17)ConstructorArgumentValues:用于封装< constructor-arg>标签的信息,其实类里面就是有 一个 map,map 中用构造函数的参数顺序作为 key,值作为 value 存储到 map 中 。
  • (18)MethodOverrides:用于封装 lookup-method 和 replaced-method 标签的信息,同样的类里面有一个 Set 对象添加 LookupOverride 对象和 ReplaceOverride 对象。
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
红黑树(一) 2023-10-30 05:57:38