簡體   English   中英

如何在Spring XML元數據配置中為bean設置ServletContext屬性

[英]How to set ServletContext property for a bean in Spring XML metadata configuration

我嘗試在這里搜索,但我找不到解決方案。 我有一些XML元數據,如下所示。

<bean class="javax.servlet.ServletContext" id="servletContext" />

<bean class="com.abc.ProductController">
    <property name="servletContext" ref="servletContext"/>
</bean>

使用此配置,我得到一個例外,說"javax.servlet.ServletContext"是一個接口,它無法使用id servletContext創建一個bean。 ProductController類在某個jar中,我無法修改,但我希望它在我的應用程序中作為bean。 它具有自動裝配的ServletContext屬性。

如果需要在XML config spring應用程序中為ServletContext創建bean,可以使用實現ServletContextAwareBeanFactory<ServletContext>

public class ServletContextFactory implements FactoryBean<ServletContext>,
            ServletContextAware{
    private ServletContext servletContext;

    @Override
    public ServletContext getObject() throws Exception {
        return servletContext;
    }

    @Override
    public Class<?> getObjectType() {
        return ServletContext.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }

    @Override
    public void setServletContext(ServletContext servletContext) {
        this.servletContext = servletContext;
    }

}

然后你可以聲明:

<bean class="org.app.ServletContextFactory" id="servletContext" />

<bean class="com.abc.ProductController">
    <property name="servletContext" ref="servletContext"/>
</bean>

只需在控制器中自動連接上下文:

@Autowired
private ServletContext context;

您不能像這樣在XML中引用servlet上下文,因為它的生命周期由servlet容器控制。

解決方案是讓com.abc.ProductController實現ServletContextAware然后Spring會為你設置它。

使用java配置使用上面由Serge Ballesta創建的ServletContextFactory和:

@Configuration
public class WebAppConfiguration {

    @Autowired
    private ServletContextFactory servletContextFactory;

    @Bean
    public ServletContextFactory servletContextFactory() {
         return new ServletContextFactory();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM