这是我Spring专栏的第五篇文章: Spring中Bean的工作流程及一些重要类的概念 在之前我为大家讲解了以下内容:
BeanDefinition表示Bean定义,BeanDefinition中存在很多属性用来描述一个Bean的特点。比如:
在Spring中, 我们经常使用以下三种方式来定义一个bean:
除了这三种声明式定义Bean之外, 我们还可以编程式定义Bean
- AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
-
- // 生成一个BeanDefinition对象,并设置beanClass为User.class,并注册到ApplicationContext中
- AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
- beanDefinition.setBeanClass(Juejin.class);
- context.registerBeanDefinition("juejin", beanDefinition);
-
- System.out.println(context.getBean("juejin"));
我们还可以使用 BeanDefinition对 Bean的其他属性进行设置
- beanDefinition.setScope("prototype"); // 设置作用域
- beanDefinition.setInitMethodName("init"); // 设置初始化方法
- beanDefinition.setLazyInit(true); // 设置懒加载
最终, 通过声明式定义的 Bean都会被Spring解析成对应的 BeanDefinition对象, 并放入Spring容器中
接下来主要讲解的是几种 BeanDefinition读取器(BeanDefinitionReader), 这几种读取器在Spring源码中使用的较多
可以直接把某个类转换为 BeanDefinition, 并且会解析该类上的注解
具体以懒加载注解 @Lazy为例, 可以跟着下面几张图进入源代码看一遍
<