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依赖查找与注入在来源上面的区别?