为什么Spring不能自动装配一个叫做环境的bean呢?

时间:2014-11-14 15:02:07

标签: java spring

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

但是,environmentEnvironment类生成@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}}

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