在Spring中创建servlet上下文而不进行自动装配

时间:2015-06-30 03:13:30

标签: java spring dependency-injection singleton

我有一个单例类,其中一个私有成员是ServletContext对象。 因为我试图用纯java代码编写,所以我把它作为单例来删除spring依赖。

Results(string Q1, string Q2, ....)

但是这里public class Utils { private static Utils utils = null; public Utils() { // Exists only to defeat instantiation. } public synchronized static Utils getInstance() { if (utils == null) { utils = new Utils(); } return utils; } @Autowired private ServletContext servletContext; public void makeUtils() { // output csv path String outputFile = servletContext.getRealPath("/util"); } } 将为null,因为我正在手动创建servletContext类的对象。不是使用@Autowired。所以春天不是注入依赖。我该怎么解决这个问题呢。

1 个答案:

答案 0 :(得分:2)

@Autowired是一个弹簧注释。

如果您希望在响应该注释时发生某些事情,那么您需要使用spring。如果要删除对spring的依赖,则不能使用Autowired。您需要选择一个 - 您是否依靠弹簧进行接线?

您可以遵循的一些解决方案:

使用Spring

使Utils成为一个弹簧豆并将其注入

Utils放入弹簧上下文(bean工厂),然后将其(使用@Autowired或其他布线策略)注入到其他想要使用它的类中。

Utils成为一个春豆并查找它。

没有太多理由这样做,但如果你愿意,你可以访问你的spring bean工厂(可能通过ApplicationContext)并使用BeanFactory.getBean(Class<T>)按类型查找bean

使用Spring自动装配现有的Utils对象

同样,这样做的理由不是很多,但是如果你有AutowireCapableBeanFactory的实例(你可以通过ApplicationContext获得),那么你可以致电autowireBean(Object existingBean)来获得春天连接@Autowired字段。

注意:我的方法/类引用来自Spring 3.2,因为它现在在我的IDE中打开了。如果您有不同的弹簧版本,则可能需要进行调整)

没有Spring

Servlet (或监听器)中实例化Utils

configure上创建一个Utils方法,其中ServletContextServlet(或ServletContextListener)内部调用configure方法在servletContext上设置Utils字段。

存储静态全局ServletContext

创建像ServletContextHolder这样的对象,其中包含一个静态字段,您可以在其中存储ServletContextServlet(或ServletContextListener)内部调用该持有人的setContext方法设置servletContext字段。
Utils内拨打ServletContextHolder.getContext()