整理了一下Spring的核心概念
BeanDefinition表示Bean定义,BeanDefinition中存在很多属性用来描述一个Bean的特点。比如:
在Spring中,我们经常会通过以下几种方式来定义Bean:
这些,我们可以称之申明式定义Bean。
我们还可以编程式定义Bean,那就是直接通过BeanDefinition,比如:
- AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
-
- // 生成一个BeanDefinition对象,并设置beanClass为User.class,并注册到ApplicationContext中
- AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
- beanDefinition.setBeanClass(User.class);
- context.registerBeanDefinition("user", beanDefinition);
-
- System.out.println(context.getBean("user"));
我们还可以通过BeanDefinition设置一个Bean的其他属性
- beanDefinition.setScope("prototype"); // 设置作用域
- beanDefinition.setInitMethodName("init"); // 设置初始化方法
- beanDefinition.setLazyInit(true); // 设置懒加载
和申明式事务、编程式事务类似,通过
接下来,我们来介绍几种在Spring源码中所提供的BeanDefinition读取器(BeanDefinitionReader),这些BeanDefinitionReader在我们使用Spring时用得少,但在Spring源码中用得多,相当于Spring源码的基础设施。
可以直接把某个类转换为BeanDefinition,并且会解析该类上的注解,比如
- AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
-
- AnnotatedBeanDefinitionReader annotatedBeanDefinitionReader = new AnnotatedBeanDefinitionReader(context);
-
- // 将User.class解析为BeanDefinition
- annotatedBeanDefinitionReader.register(User.class);
-
- System.out.println(context.getBean("user"));
注意:它能解析的注解是:@Conditional,@Scope、@Lazy、@Primary、@DependsOn、@Role、@Description
可以解析
- AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
-
- XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(context);
- int i = xmlBeanDefinitionReader.loadBeanDefinitions("spring.xml");
-
- System.out.println(context.getBean("user"));
ClassPathBeanDefinitionScanner是扫描器,但是它的作用和BeanDefinitionReader类似,它可以进行扫描,扫描某个包路径,对扫描到的类进行解析,比如,扫描到的类上如果存在@Component注解,那么就会把这个类解析为一个BeanDefinition,比如:
- AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
- context.refresh();
-
- ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(context);
- scanner.scan("com.bethmeta");
-
- System.out.println(context.getBean("userService"));
BeanFactory表示Bean工厂,所以很明显,BeanFactory会负责创建Bean,并且提供获取Bean的API。
而ApplicationContext是BeanFactory的一种,在Spring源码中,是这么定义的:
public interf