我有一个单例类,其中一个私有成员是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。所以春天不是注入依赖。我该怎么解决这个问题呢。
答案 0 :(得分:2)
@Autowired
是一个弹簧注释。
如果您希望在响应该注释时发生某些事情,那么您需要使用spring。如果要删除对spring的依赖,则不能使用Autowired
。您需要选择一个 - 您是否依靠弹簧进行接线?
您可以遵循的一些解决方案:
Utils
成为一个弹簧豆并将其注入将Utils
放入弹簧上下文(bean工厂),然后将其(使用@Autowired
或其他布线策略)注入到其他想要使用它的类中。
Utils
成为一个春豆并查找它。没有太多理由这样做,但如果你愿意,你可以访问你的spring bean工厂(可能通过ApplicationContext
)并使用BeanFactory.getBean(Class<T>)
按类型查找bean
Utils
对象同样,这样做的理由不是很多,但是如果你有AutowireCapableBeanFactory
的实例(你可以通过ApplicationContext
获得),那么你可以致电autowireBean(Object existingBean)
来获得春天连接@Autowired
字段。
注意:我的方法/类引用来自Spring 3.2,因为它现在在我的IDE中打开了。如果您有不同的弹簧版本,则可能需要进行调整)
Utils
在configure
上创建一个Utils
方法,其中ServletContext
在Servlet
(或ServletContextListener
)内部调用configure
方法在servletContext
上设置Utils
字段。
ServletContext
创建像ServletContextHolder
这样的对象,其中包含一个静态字段,您可以在其中存储ServletContext
在Servlet
(或ServletContextListener
)内部调用该持有人的setContext
方法设置servletContext
字段。
在Utils
内拨打ServletContextHolder.getContext()