目录
- 1.什么是BeanDefinition?
- 2.如何生成BeanDefinition?
- 2.1. @Component
- 2.1. bean标签
- 2.3. @Bean注解
- 2.4. AbstractBeanDefinition
- 2.5. 利用BeanDefinition 读取器-解析类
- 2.6. XmlBeanDefinitionReader - 解析 xml文件
- 2.7. ClassPathBeanDefinitionScanner 扫描生成 BeanDefinition
- 3.总结
1.什么是BeanDefinition?
BeanDefinition可以理解为bean的定义,包括: Bean 的类名 Bean的父类 Bean是否为懒加载
bean是否可以自动注入 Bean的 作用域、自动绑定模式、生命周期回调、初始方法、销毁方法等 Bean
之间的依赖关系,dependencies 构造参数、属性设置 等等
2.如何生成BeanDefinition?
2.1. @Component
在类上加@Component注解,spring扫描类发现这个类上存在@Component注解,就会把这个类解析成BeanDefinition对象
@Component
public class UserService{
}
2.1. bean标签
spring.xml文件中加bean标签
<bean class= "com.xxx.Service.Uservice" id= "userService" init-method ="xx" lazy-init="true"/>
2.3. @Bean注解
@Bean
Public UserService userService{return new Uservice();
}
2.4. AbstractBeanDefinition
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(AppConfig.class);
AbstractBeanDefinition beanDefinition=BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition.setBeanClass(UserService.class);
beanDefinition.setScope("prototype");
context.registerBeanDefinition("userService",beanDefinition);
2.5. 利用BeanDefinition 读取器-解析类
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
AnnotatedBeanDefinitionReader annotatedBeanDefinitionReader = new AnnotatedBeanDefinitionReader(context);
annotatedBeanDefinitionReader.register(User.class);
System.out.println(context.getBean("user"));
打印:
com.zjy.service.User@68bbe345
2.6. XmlBeanDefinitionReader - 解析 xml文件
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(context);xmlBeanDefinitionReader.loadBeanDefinitions("spring.xml");System.out.println(context.getBean("user"));
打印:
com.zjy.service.User@45820e51
i =1 表示只解析出来一个
2.7. ClassPathBeanDefinitionScanner 扫描生成 BeanDefinition
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.refresh();
ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(context);
int i = scanner.scan("com.zjy");
System.out.println(context.getBean("userService"));
@Component
public class UserService {}
扫描com.zjy 这个路径,发现UserService 上有@Component 注解,就把它注册成bean放到BeanDefinition 中
打印:
com.zjy.service.UserService@5bb21b69
3.总结
好记性不如烂笔头,知道不如做到。