Spring中的BeanDefinition系列(一)—— BeanDefinition

前言

​ Bean是Spring中必不可少的一个组件,Bean之于Spring,就像是 员工之于公司Spring把每个不一样的对象都封装成了Bean,就像是公司把每个不一样的人都封装成了员工

一个BeanDefinition描述和定义了创建一个bean需要的所有信息,属性,构造函数参数以及访问它们的方法。还有其他一些信息,比如这些定义来源自哪个类等等。

自己设计BeanDefinition

前言

​ 通过前面的简要介绍,我们大概知道了BeanDefinition里面有哪些东西。这一节我们来自己设计一下BeanDefinition。然后与Spring中的BeanDefinition做一下比较。

设计依据

​ 前面我们谈到,Bean之于Spring,就像是 员工之于公司。Spring 框架的目的之一便是像公司系统化地管理员工那样系统化地管理对象。那我们来现在来提炼一下,如果想要系统化地管理对象,我们都需要哪些最基本的东西:

  • 管理对象的创建,控制对象的创建,那么需要:

    • 对象的类路径,用于创建对象时,加载该类。
    • 对象的依赖关系,创建该对象时,需要加载相应的依赖的类,比如:创建一个汽车对象时,需要创建轮子,那么需要加载轮子类。
  • 管理对象的属性,对属性的访问做控制,那么需要:

    • 保存对象的属性。
    • 对象属性的访问权限。
  • 管理对象的方法,对方法的的执行做控制

    • 保存的对象的方法。
  • 方便获取对象,那么需要:

    • 对象的ID,即bean的名称。

设计的BeanDefinition结构

方法名 方法对应的意义
BeanClassPath(get,set) 对象的类路径
dependOns[] (get,set) 创建对象还要依赖的类
properties[] (get,set) 对象的属性
propertiesControl[] (get,set) 对象属性的控制
methods[] (get,set) 对象的方法
methodsControl[] (get,set) 对象方法的控制,对方法如何做代理
BeanName(get,set) Bean的名字

通过上面这些,我们就大概可以对一个对象做一个统一化管理,其中还可以将methods和properties做一个简化,只需要一个对象的Class对象便可,因为该对象的Class对象中便保存着该对象的属性名和方法!

Spring中的BeanDefinition

前言

​ 前面我们说了自己设计的BeanDefinition,现在让我们来看看Spring的BeanDefinition,看看和我们自己设计出来的有哪些异同,我们又从中可以学到什么?

Spring中的BeanDefinition的方法

​ 我们在这里列出Spring中的BeanDefinition的方法,其中和我们不一样我用蓝色来标出,和我们不一样而且感觉很重要的我们用红色来标出。

方法名 方法对应的意义
parentName(get,set) Name of the parent definition of this bean definition,if any.
beanClassName(get,set) Specify the bean class name of this bean definition.
scope(get,set) The scope of this bean.(SCOPE_SINGLETON、SCOPE_PROTOTYPE)
lazyInit(get,set) If false, the bean will get instantiated on startup by bean factories that perform eager initialization of singletons.
dependsOn(get,set) The names of the beans that this bean depends on being initialized.
The bean factory will guarantee that these beans get initialized first.
autowireCandidate(get,set) Whether this bean is a candidate for getting autowired into some other bean.
Note that this flag is designed to only affect type-based autowiring. It does not affect explicit references by name, which will get resolved even if the specified bean is not marked as an autowire candidate. As a consequence, autowiring by name will nevertheless inject a bean if the name matches.
primary(get,set) Whether this bean is a primary autowire candidate.
If this value is {@code true} for exactly one bean among multiple matching candidates, it will serve as a tie-breaker.
factoryBeanName(get,set) Specify the factory bean to use, if any.
factoryMethodName(get,set) Specify a factory method, if any.
constructorArgumentValues(get,set) The constructor argument values for this bean.
mutablePropertyValues(get,set) The property values to be applied to a new instance of the bean.
abstract(get,set) Whether this bean is “abstract”, that is, not meant to be instantiated.
role(get,set) The role hint for this {@code BeanDefinition}. The role hint provides the frameworks as well as tools with an indication of the role and importance of a particular {@code BeanDefinition}.(#ROLE_APPLICATION,#ROLE_SUPPORT,#ROLE_INFRASTRUCTURE)
description(get,set) A human-readable description of this bean definition.
resourceDescription(get,set) Description of the resource that this bean definition came from (for the purpose of showing context in case of errors).
originatingBeanDefinition(get,set) The originating BeanDefinition, or {@code null} if none.Allows for retrieving the decorated bean definition, if any.Note that this method returns the immediate originator. Iterate through the originator chain to find the original BeanDefinition as defined by the user.

PS:很有必要将Spring的BeanDefinition的设计与我们的设计做对比,反思一下我们哪里设计多余了,哪里又缺少了,为什么会多余,又为什么会缺少。

​ 比如,我自己考虑的beanClassName为类路径,而Spring为bean名字,是我哪里想错了,还有我的DepondsOn里面存的是依赖的类路径,而Spring的DepondsOn则存的是依赖的bean的name,是我哪里想错了? 类路径真的还有必要再特别存储一下吗? 答案肯定是不需要的,所有的类已经在类路径下了,所以我这一步就是完全多余的。

Spring中BeanDefinition的类图

Spring中的BeanDefinition系列(一)—— BeanDefinition_第1张图片

你可能感兴趣的:(JAVA其他)