下面的代码创建一个父上下文,并将一个名为Environment
的类放入一个名为environment
的上下文中,该名称通过AnnotationBeanNameGenerator
生成。然后将其自动连接到TestChild
中,该AnnotationBeanNameGenerator
位于子上下文中。
但是,environment
为Environment
类生成@RestController
public class TestChild {
@Autowired
public TestChild(Environment environment) { }
}
的名称,当我启动子上下文(Web服务器)时,我收到错误消息,说明它可以&# 39; t自动装配豆子。如果我将bean的名称更改为固定的(即某些guid),它可以正常工作。
我在下面的代码中使用了组件扫描,但这些是我项目中唯一的类。
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();
-
{{1}}
答案 0 :(得分:0)
您可能遇到此问题,因为应用程序上下文已包含名为environment
的bean作为核心Spring功能的一部分。
您可以在下面看到:
org.springframework.core.env.Environment e = applicationContext.getBean("environment");
LOGGER.info(e.getClass().getName());
//prints: org.springframework.web.context.support.StandardServletEnvironment