從這個繼承圖可以看出,這三個類都是繼承與 AbstractBeanDefinition,下面說說這三個類的區別。

RootBeanDefinition、ChildBeanDefinition
RootBeanDefinition可以單獨作為一個BeanDefinition,也可以作為其他BeanDefinition的父類。但是他不能作為其他BeanDefinition的子類(可以去看源碼,在setParentName的時候,會拋出一個異常)。
ChildBeanDefinition相當於一個子類,不可以單獨存在,必須要依賴一個父BeanDetintion。(最大的區別他的parentName屬性是通過構造方法設置的,而且並沒有提供一個無參構造方法給我們。)
// 演示代碼
public class AdminService { private String name; private Integer age; public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "AdminService{" + "name='" + name + '\'' + ", age=" + age + '}'; } } public class TestDemo { public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); // 自定義BeanDefinition,給其設置屬性值,並且注冊到Spring當中。 RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(); rootBeanDefinition.getPropertyValues().add("name", "micheal"); rootBeanDefinition.setBeanClass(AdminService.class); // 注意,這里必須要提供一個父BeanDefinition ChildBeanDefinition childBeanDefinition = new ChildBeanDefinition("a1"); childBeanDefinition.getPropertyValues().add("age", 18); applicationContext.registerBeanDefinition("a1", rootBeanDefinition); applicationContext.registerBeanDefinition("a2", childBeanDefinition); applicationContext.refresh();
System.out.println("a1:" + applicationContext.getBean("a1"));
System.out.println("a2:" + applicationContext.getBean("a2"));
} }
=====================================輸出結果====================================
a1:AdminService{name='micheal', age=null}
a2:AdminService{name='micheal', age=18}
