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