BeanFactorygetBean(String)getBean(String,Object...)getBean(Class)getBean(Class,Object...)getBeanProvider(Class)getBeanProvider(ResolvableType)getBean(String,Class)ListableBeanFactory根据 Bean 类型查找
getBeanNamesForType(Class)getBeanNamesForType(ResolvableType)getBeansOfType(Class) 以及重载方法
注意通过bean类型进行查找可以会导致bean提前初始化,因为可能需要bean的元信息进行比较。
通过注解类型查找
getBeanNamesForAnnotation(Class<? extends Annotation>)getBeansWithAnnotation(Class<? extends Annotation>)findAnnotationOnBean(String,Class<? extends Annotation>)HierarchicalBeanFactorygetParentBeanFactory()containsLocalBean 方法实现BeanFactoryUtils#beanOfTypeBeanFactoryUtils#beansOfTypeIncludingAncestorsBeanFactoryUtils#beanNamesForTypeIncludingAncestorsgetIfAvailable(Supplier)ifAvailable(Consumer)stream()| 依赖查找类型 | 代表实现 | 是否安全 | 
|---|---|---|
| 单一类型查找 | BeanFactory#getBean | 否 | 
| ObjectFactory#getObject | 否 | |
| ObjectProvider#getIfAvailable | 是 | |
| 集合类型查找 | ListableBeanFactory#getBeansOfType | 是 | 
| ObjectProvider#stream | 是 | 
注意:层次性依赖查找的安全性取决于其扩展的单一或集合类型的 BeanFactory 接口
| Bean 名称 | Bean 实例 | 使用场景 | 
|---|---|---|
| environment | Environment 对象 | 外部化配置以及 Profiles | 
| systemProperties | java.util.Properties 对象 | Java 系统属性 | 
| systemEnvironment | java.util.Map 对象 | 操作系统环境变量 | 
| messageSource | MessageSource 对象 | 国际化文案 | 
| lifecycleProcessor | LifecycleProcessor 对象 | Lifecycle Bean 处理器 | 
| applicationEventMulticaster | ApplicationEventMulticaster 对 象 | Spring 事件广播器 | 
| Bean 名称 | Bean 实例 | 使用场景 | 
|---|---|---|
| org.springframework.context.annotation.internalConfigurationAnnotationProcessor | ConfigurationClassPostProcesso | 处理 Spring 配置类 | 
| org.springframework.context.annotation.internalAutowiredAnnotationProcessor | AutowiredAnnotationBeanPostProcessor 对象 | 处理 @Autowired 以及 @Value 注解 | 
| org.springframework.context.annotation.internalCommonAnnotationProcessor | CommonAnnotationBeanPostProcessor 对象 | (条件激活)处理 JSR-250 注解,如 @PostConstruct 等 | 
| org.springframework.context.event.internalEventListenerProcessor | EventListenerMethodProcessor 对象 | 处理标注 @EventListener 的 Spring 事件监听方法 | 
| org.springframework.context.event.internalEventListenerFactory | DefaultEventListenerFactory 对象 | @EventListener 事件监听方法适配为 ApplicationListener | 
| org.springframework.context.annotation.internalPersistenceAnnotationProcessor | PersistenceAnnotationBeanPostProcessor 对象 | (条件激活)处理 JPA 注解场景 | 
BeansException 子类型| 异常类型 | 触发条件(举例) | 场景举例 | 
|---|---|---|
| NoSuchBeanDefinitionException | 当查找 Bean 不存在于 IoC 容器时 BeanFactory#getBean | ObjectFactory#getObject | 
| NoUniqueBeanDefinitionException | 类型依赖查找时,IoC 容器存在多个 Bean 实例 | BeanFactory#getBean(Class) | 
| BeanInstantiationException | 当 Bean 所对应的类型非具体类时 | BeanFactory#getBean | 
| BeanCreationException | 当 Bean 初始化过程中 | Bean 初始化方法执行异常时 | 
| BeanDefinitionStoreException | 当 BeanDefinition 配置元信息非法时 | XML 配置资源无法打开时 | 
BeanFactory.getBean 方法的执行是线程安全的,超过过程中会增加互斥锁
1、ObjectFatory和BeanFactory的区别?
2、BeanFactory.getBean操作是否线程安全?
3、Spring依赖查找与注入在来源上面的区别?