gpt4 book ai didi

java - 为什么 Spring 不能 Autowiring 一个名为环境的 bean?

转载 作者:太空宇宙 更新时间:2023-11-04 14:23:24 26 4
gpt4 key购买 nike

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

但是,当我启动子上下文(Web 服务器)时,使用 AnnotationBeanNameGeneratorEnvironment 类生成 environment 的名称我收到一条错误消息,指出它无法 Autowiring bean。如果我将 bean 的名称更改为固定名称(即某个 guid),它就可以正常工作。

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

@RestController
public class TestChild {

@Autowired
public TestChild(Environment environment) { }
}

--

public class Environment {

public Environment() {
System.err.print("hey");
}
}

--

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();

最佳答案

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

您可以在下面看到:

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

关于java - 为什么 Spring 不能 Autowiring 一个名为环境的 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26932845/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com