我想创建工厂类。例如是FooFactory。在Foo实例化之前,必须将FooFacoty注入ServletContext到构造函数。我的代码段如下:
public class FooFactory() {
public static Foo getFoo() {
ctx = //getservlet context
Foo foo = new Foo(ctx);
return foo;
}
}
答案 0 :(得分:3)
编辑:您可以使用ServletContextFactoryBean
。然后,您可以将对此的引用传递给您的工厂(例如,作为方法参数)。喜欢这个
<bean id="servletContext" class="org.springframework.web.context.support.ServletContextFactoryBean"/>
<bean id="foo" class="FooFactory" factory-method="getFoo">
<constructor-arg index="0" ref="servletContext"/>
</bean>
然后,您将FooFactory.getFoo
更改为
public static Foo getFoo(ServletContext ctx) {
Foo foo = new Foo(ctx);
return foo;
}
我知道没有直接的方式,但你可以通过实现ServletContextAware或ApplicationContextAware间接地做到这一点。
This article描述了详细信息。
答案 1 :(得分:3)
我在寻找如何做到这一点时遇到了这篇文章。它帮助我作为一个起点,但由于ServletContextFactoryBean
在春季3被弃用,我不得不尝试不同的东西。
我找到了两个选项:
@Autowired
public AnAutowiredConstructor(WebApplicationContext webApplicationContext)
{
servletContext = webApplicationContext.getServletContext();
}
或者您可以实施org.springframework.web.context.ServletContextAware
。
public class SomeClass implements ServletContextAware
{
public void setServletContext(ServletContext servletContext)
{
}
}
答案 2 :(得分:1)
您可以使用xml直接将Spring WebApplicationContext保存的ServletContext实例注入到您的bean中:
<bean id="myBean" class="foo.bar.SomeClass">
<constructor-arg ref="servletContext"/>
确实,servlet上下文在应用程序上下文中注册为“servletContext”。见http://docs.spring.io/spring/docs/4.0.x/javadoc-api/org/springframework/web/context/WebApplicationContext.html#SERVLET_CONTEXT_BEAN_NAME。也适用于Spring 3.x