Spring MVC初始化一个对象

时间:2013-02-28 13:08:50

标签: java spring jsp spring-mvc servlet-3.0

在我的SpringMVC项目中,我需要一个特定的策略来调用一个解析xml文件的类,该文件拥有我的RMI服务器ip&港口和url必须相对于servletContext url:

HttpServletRequest request;    
request.getServletContext().getRealPath("/WEB-INF/LABLAB/RMI-Config.xml")

我想在tomcat中启动应用程序时加载这些类,而不是在我调用Controller类时,因为我的应用程序依赖于我的RMI,因此在我需要解析文件和其他任何内容之前。使用IP& PORT字段开始连接到我的RMI&然后调用rmi方法稍后再做一些事情......

现在

我该怎么办?请告诉我如何初始化HttpServletRequest和amp;的实例。当我不在Controller类上时给出一个初始值。

谢谢

2 个答案:

答案 0 :(得分:3)

您正在使用Spring,然后您可以创建一个类并实现IntializingBean。如果你想获得ServletContext,你可以在初始化bean中简单地使用@Autowired注释。例如:

@Component
public class SomeBean implements InitializingBean {

    @Autowired
    private ServletContext context;   

    public void afterPropertiesSet() throws Exception {
       String path = context.getRealPath("/WEB-INF/LABLAB/RMI-Config.xml");
       //do something.
    }
}

根据文档:

  

IntializingBean - 由需要的bean实现的接口   一旦BeanFactory设置了所有属性,就会做出反应。

或者使用ServletContextListener查看here如何执行此操作。

答案 1 :(得分:2)

您需要实施ServletContextListener界面并从web.xml引用它:

<listener>
    <listener-class>InitializingListener</listener-class>
</listener>

界面采用contextInitialized(ServletContextEvent sce)方法,您可以在其中调用sce.getServletContext(),因此您不需要HttpServletRequest

如果这不成功,因为您还需要从初始化类访问一些Spring bean,然后忘记实现ServletContextListener接口,而是执行以下操作:

  1. 通过Spring实例化您的初始化类(创建该类型的bean)。
  2. 制作班级工具ServletContextAware。这将导致Spring将ServletContext注入您的班级。
  3. 在该bean上定义init方法(使用init-method bean属性,或定义@PostConstruct带注释的方法)
  4. 使用depends-on bean属性使所有Controller bean依赖于初始化bean。因此,initialaizing bean将在任何Controller bean之前创建。
  5. 如果没有最后一步,则无法保证您的控制器在初始化bean完成其工作之前不会开始处理请求。但是,在每个控制器bean上指定depends-on属性也存在问题,尤其是它们通常是通过应用@Controller注释而不是xml配置来创建的。 this post中描述了一个很好的解决方法。