Spring之【BeanDefinition】

目录

BeanDefinition接口

代码片段

作用

BeanDefinitionRegistry接口

代码片段

作用

RootBeanDefinition实现类

GenericBeanDefinition实现类


BeanDefinition接口

代码片段

java 复制代码
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接口

代码片段

java 复制代码
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实现类

java 复制代码
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 复制代码
/**
 * 普通Java类,没有加任何注解
 */
public class Teacher {
}
java 复制代码
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);
    }
}
相关推荐
都叫我大帅哥6 分钟前
Java ZGC垃圾收集器:低延迟的终极武器,全面解析与实战指南
java·jvm
Jason?1319 分钟前
Unity基于Recoder的API写了一个随时录屏的工具
java·unity·游戏引擎
都叫我大帅哥19 分钟前
🐇 RabbitMQ延时队列:让消息学会“踩点上班”的终极指南
java·rabbitmq
JiaHao汤1 小时前
Java 虚拟机之双亲委派机制
java·jvm·后端
C4程序员1 小时前
北京JAVA基础面试30天打卡03
java·开发语言·面试
Java技术小馆2 小时前
PromptPilot打造高效AI提示词
java·后端·面试
whysqwhw2 小时前
线程池数量配置
java
计算机毕设定制辅导-无忧学长3 小时前
InfluxDB 权限管理与安全加固(一)
java·struts·安全
老华带你飞3 小时前
生产管理ERP系统|物联及生产管理ERP系统|基于SprinBoot+vue的制造装备物联及生产管理ERP系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·论文·制造·毕设·生产管理erp系统
一勺-_-3 小时前
全栈:如何判断自己应该下载哪个版本的Tomcat
java·tomcat