如何在子注释上下文中使用spring属性源?

时间:2013-02-22 00:51:26

标签: java spring configuration annotations

我正在尝试使用带注释的配置类复制适用于XML配置的内容。我遇到的问题是无法访问子上下文中定义的属性源。

工作的xml看起来像

家长背景:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="proxyChannelQueue" class="java.util.concurrent.ArrayBlockingQueue">
        <constructor-arg value="10"/>
    </bean>

</beans>

儿童背景:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:property-placeholder location="proxy-host.properties"/>

    <bean class="org.eclipse.jetty.server.Server"
          p:handler-ref="proxyHostHandler"
            init-method="start">
        <constructor-arg value="${proxyHostPort}"/>
    </bean>

    <bean id="proxyHostHandler" class="com.sjl.web.ProxyHostHandler"
            p:proxyChannelQueue-ref="proxyChannelQueue"/>
</beans>

启动代码:

    ClassPathXmlApplicationContext parentContext = new ClassPathXmlApplicationContext("test/parent-context.xml");
    ClassPathXmlApplicationContext childContext = new ClassPathXmlApplicationContext(new String[] {"test/child-context.xml"}, parentContext);

我尝试使用配置类看起来像。

家长背景:

@Configuration
public class ParentConfiguration {
    @Bean(name = "proxyChannelQueue")
    public BlockingQueue<ProxyChannel> getProxyChannelQueue() {
        return new ArrayBlockingQueue<ProxyChannel>(10);
    }
}

儿童背景:

@Configuration
@PropertySource("classpath:proxy-host.properties")
public class ChildContext {
    private static final Logger LOGGER = LoggerFactory.getLogger(ChildContext.class);
    @Autowired
    private Environment environment;

    @Resource(name = "proxyChannelQueue")
    private BlockingQueue<ProxyChannel> proxyChannelQueue;

    public static void main(String[] args) {
        new HierarchicalAnnotationConfigApplicationContext(ChildContext.class);
    }

    @Bean
    public Server getJettyServer() throws Exception {
        int proxyHostPort = environment.getProperty("proxyHostPort", Integer.class);
        Server server = new Server(proxyHostPort);
        server.setHandler(getHandler());
        server.start();

        return server;
    }

    @Bean
    public Handler getHandler() {
        ProxyHostHandler proxyHostHandler = new ProxyHostHandler();
        proxyHostHandler.setProxyChannelQueue(proxyChannelQueue);
        return proxyHostHandler;
    }
}

启动代码:

AnnotationConfigApplicationContext parentContext = new AnnotationConfigApplicationContext(ParentConfiguration.class);
AnnotationConfigApplicationContext childContext = new AnnotationConfigApplicationContext();
childContext.setParent(parentContext);
childContext.register(ChildContext.class);
childContext.refresh();

我在尝试检索ChildContext getJettyServer方法中的proxyHostPort时得到一个空指针。检查环境变量显示它只包含2个属性源(systemProperties和systemEnvironment),而不是我期望的3个。

如果我将它们作为单个组合上下文运行,则相同的配置有效。例如。 :

AnnotationConfigApplicationContext parentContext = new AnnotationConfigApplicationContext(ParentConfiguration.class, ChildContext.class);

但是我希望使用父上下文提供隔离。

干杯, 彼得

0 个答案:

没有答案