为何Spring中Autowired注入的ApplicationContext无法通过getBean()获取?
Spring官方文档提到,可以通过依赖注入(DI)把ApplicationContext自动装配到字段、构造函数参数或方法参数中。因此我认为它是一个Bean,应该能通过ApplicationContext的getBean()方法获取(只是出于好奇,知道这么做冗余),但调用该方法时总是抛出Bean未找到的异常。
示例代码:
@Component public class MyBean { // Spring注入的参数 public MyBean(ApplicationContext context){ SaveFileRepository repository = context.getBean(SaveFileRepository.class);// 正常工作,无异常 ApplicationContext context2 = context.getBean(AnnotationConfigApplicationContext.class);// 抛出异常,明明Spring刚在构造函数里注入了context,却无法通过getBean获取它 } }
原因解析
ApplicationContext并非普通注册Bean
Spring确实会将ApplicationContext实例注入到需要它的组件中,但这是通过容器的特殊机制实现的,而非将其作为普通Bean注册到自身的Bean注册表内。getBean()方法只能获取那些通过@Component、@Bean等方式显式注册的Bean,ApplicationContext不在这个范围内。类型匹配存在偏差
你尝试获取AnnotationConfigApplicationContext.class类型的实例,但实际注入的ApplicationContext可能是Spring生成的代理对象,或是经过包装的实现类(比如容器内部的默认上下文实现),并非直接的AnnotationConfigApplicationContext实例。就算换成ApplicationContext.class调用getBean(),同样会失败——因为它根本没被当作Bean注册。注入逻辑是特殊处理
Spring对ApplicationContext、BeanFactory这类容器核心对象的注入,是通过ApplicationContextAware接口或构造函数/字段注入的专属逻辑实现的,和普通Bean的获取流程完全不同。容器不会把自身当作一个Bean存放到自己的注册表中。
内容的提问来源于stack exchange,提问作者Kkraft

