目錄
BeanDefinition接口
代碼片段
作用
BeanDefinitionRegistry接口
代碼片段
作用
RootBeanDefinition實現類
GenericBeanDefinition實現類
BeanDefinition接口
代碼片段
public interface BeanDefinition {// ...void setScope(@Nullable String scope);@NullableString getScope();void setLazyInit(boolean lazyInit);boolean isLazyInit();void setDependsOn(@Nullable String... dependsOn);@NullableString[] getDependsOn();boolean isSingleton();boolean isPrototype();boolean isAbstract();// ...
}
作用
存儲Bean的定義信息,Spring通過Bean對應的BeanDefinition中的信息來判斷該Bean是否單例,是否懶加載,是否抽象,是否依賴于其它的Bean等等
BeanDefinitionRegistry接口
代碼片段
public interface BeanDefinitionRegistry extends AliasRegistry {// 往容器中添加BeanDefinitionvoid registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException;// 刪除容器中指定的BeanDefinitionvoid removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;// 獲取容器中指定的BeanDefinitionBeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;// 判斷容器中是否包含指定的BeanDefinitionboolean containsBeanDefinition(String beanName);// 獲取容器中所有BeanDefinition的nameString[] getBeanDefinitionNames();// 統計容器中BeanDefinition的個數int getBeanDefinitionCount();// ...}
作用
提供對Spring容器中BeanDefinition進行操作的方法
RootBeanDefinition實現類
public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(BeanDefinitionRegistry registry, @Nullable Object source) {// ...// 這里Spring使用了RootBeanDefinition將內部組件Bean對象的BeanDefinition添加到容器中if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));}// ...
}private static BeanDefinitionHolder registerPostProcessor(BeanDefinitionRegistry registry, RootBeanDefinition definition, String beanName) {// ...// 添加BeanDefinition到Spring容器中registry.registerBeanDefinition(beanName, definition);// ...}
GenericBeanDefinition實現類
/*** 普通Java類,沒有加任何注解*/
public class Teacher {
}
public class SpringMain {public static void main(String[] args) {// Spring容器DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();// 構建GenericBeanDefinition對象GenericBeanDefinition beanDefinition = new GenericBeanDefinition();beanDefinition.setBeanClass(Teacher.class);// 將GenericBeanDefinition放入Spring容器beanFactory.registerBeanDefinition("teacher", beanDefinition);// 從容器中獲取Bean對象Teacher teacherBean = beanFactory.getBean(Teacher.class);// 獲取到Bean對象:xxxx.Teacher@279ad2e3System.out.println(teacherBean);}
}