目录
BeanDefinition接口
代码片段
public interface BeanDefinition {
// ...
void setScope(@Nullable String scope);
@Nullable
String getScope();
void setLazyInit(boolean lazyInit);
boolean isLazyInit();
void setDependsOn(@Nullable String... dependsOn);
@Nullable
String[] getDependsOn();
boolean isSingleton();
boolean isPrototype();
boolean isAbstract();
// ...
}
作用
存储Bean的定义信息,Spring通过Bean对应的BeanDefinition中的信息来判断该Bean是否单例,是否懒加载,是否抽象,是否依赖于其它的Bean等等
BeanDefinitionRegistry接口
代码片段
public interface BeanDefinitionRegistry extends AliasRegistry {
// 往容器中添加BeanDefinition
void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
throws BeanDefinitionStoreException;
// 删除容器中指定的BeanDefinition
void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
// 获取容器中指定的BeanDefinition
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
// 判断容器中是否包含指定的BeanDefinition
boolean containsBeanDefinition(String beanName);
// 获取容器中所有BeanDefinition的name
String[] 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@279ad2e3
System.out.println(teacherBean);
}
}