Java 为什么Spring不能自动连接名为environment的bean?

Java 为什么Spring不能自动连接名为environment的bean?,java,spring,Java,Spring,下面的代码创建一个父上下文,并将一个名为Environment的类放入上下文中,该上下文的名称为Environment,该名称是通过AnnotationBeanNameGenerator生成的。然后自动连接到子上下文中的TestChild中 然而,随着AnnotationBeanNameGenerator为environment类生成环境名称,当我启动web服务器的子上下文时,我得到一个错误,表示它无法自动连接bean。如果我将bean的名称更改为某个固定的名称,即某个guid,它就可以正常工作

下面的代码创建一个父上下文,并将一个名为Environment的类放入上下文中,该上下文的名称为Environment,该名称是通过AnnotationBeanNameGenerator生成的。然后自动连接到子上下文中的TestChild中

然而,随着AnnotationBeanNameGenerator为environment类生成环境名称,当我启动web服务器的子上下文时,我得到一个错误,表示它无法自动连接bean。如果我将bean的名称更改为某个固定的名称,即某个guid,它就可以正常工作

我在下面的代码中使用了组件扫描,但这些是我的项目中唯一的类

@RestController
public class TestChild {

    @Autowired
    public TestChild(Environment environment) { }
}
-

-


您可能会遇到这个问题,因为应用程序上下文已经包含一个名为environment的bean作为核心Spring功能的一部分

您可以在下面看到:

org.springframework.core.env.Environment e = applicationContext.getBean("environment");
LOGGER.info(e.getClass().getName());
//prints: org.springframework.web.context.support.StandardServletEnvironment

我希望AnnotationBeanNameGenerator能够处理这个问题,这就是我使用它的原因!。。。虽然我想它当时不知道孩子的背景是什么!它将允许您在应用程序上下文中创建多个具有相同名称的bean。然而,当涉及到注入时,由于模糊性,它将失败。。。
AnnotationConfigApplicationContext parentContext = new AnnotationConfigApplicationContext();
parentContext.addBeanFactoryPostProcessor(new BeanDefinitionRegistryPostProcessor() {

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        BeanDefinition bd = new RootBeanDefinition(Environment.class, null, null);
        AnnotationBeanNameGenerator generator = new AnnotationBeanNameGenerator();
        registry.registerBeanDefinition(generator.generateBeanName(bd, registry), bd);
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { }
});
parentContext.refresh();

AnnotationConfigWebApplicationContext childContext = new AnnotationConfigWebApplicationContext();
childContext.setParent(parentContext);
childContext.scan("child");
ServletContextHandler contextHandler = new ServletContextHandler();

contextHandler.addServlet(new ServletHolder(new DispatcherServlet(childContext)), "/*");
contextHandler.addEventListener(new ContextLoaderListener(childContext));

Server server = new Server(8080) {{ setHandler(contextHandler); }};
server.start();
server.join();
org.springframework.core.env.Environment e = applicationContext.getBean("environment");
LOGGER.info(e.getClass().getName());
//prints: org.springframework.web.context.support.StandardServletEnvironment