什么是BeanDefinition?
在回答这个问题之前,先想一下我们通常是如何去定义一个Bean?
1、通过xml文件配置Bean,<bean />
2、通过配置类配置Bean,@Bean
3、通过注解自动扫描成Bean,@Component(@Service,@Controller等)
以上三种方法是我们通常定义一个Bean的方式,其实我们还可以通过BeanDefinition定义一个Bean,例如:
//定义一个BeanDefinition
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
//设置Bean对象类型
beanDefinition.setBeanClass(User.class);
//设置Bean作用域
beanDefinition.setScope("prototype");
//设置初始方法
beanDefinition.setInitMethodName("init");
//设置自动装配类型
beanDefinition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
beanFactory.registerBeanDefinition("user", beanDefinition);
beanFactory.getBean("user");
其实上面的三种我们通常定义Bean的方式,最终也都会被解析成BeanDefinition对象。再由BeanFactory根据BeanDefinition生成对应的Bean。
BeanDefinition表示Bean定义,BeanDefinition中有许多属性来描述一个Bean,如下:
- beanClass,表示Bean类型
- scope,表示Bean的作用域
- lazyInit,表示是否懒加载
- initMethodName,表示Bean初始化时要执行的方法
- destroyMethodName,表示Bean销毁时要执行的方法
还有很多...
BeanDefinition就好比工厂生产所需要的标准图纸,Bean就是根据图纸生产出来的零件。