【问题标题】:How to Initialize the application in spring?spring 如何初始化应用程序?
【发布时间】:2013-07-02 14:47:53
【问题描述】:

现在直接进入我的观点,

JSP 我会做我的应用程序的初始化过程,比如,

<%! public void jsp_init(){

      //Initialise the domain server to create protocol
      //Create the logging file
}%>

现在我要重建我以前的应用程序,从 ServletsSpring 3.2

我如何使用Spring 3.2 做到这一点?

我的一个colleague 说我要这样做initialization with Constructor of the Spring Controller

因为我在applicationContext.xml 中为controller class 创建了bean,并且我正在使用ContextLoadListnerweb.xml 中加载applicationContext.xml 文件。

这是正确的初始化方式吗?

春天的ApplicationListener怎么样?

spring 3.2 中初始化应用程序的最佳方法是什么?

希望我们的堆栈用户能给出一个好的解决方案。

【问题讨论】:

    标签: java spring jsp spring-mvc initialization


    【解决方案1】:

    如果配置正确,Spring 会为您做很多事情。如果你真的需要执行代码(而不是使用像 Log4J 这样会自动配置自身的东西),我建议注册一个 InitializingBean 并覆盖 afterPropertiesSet。然后将这个 bean 定义添加到 applicationContext.xml 文件中:

    <bean id="initializer" class="com.myproject.MyInitializer" />
    

    因此,当应用程序完全初始化时,Spring 将调用MyInitializer.afterPropertiesSet() 方法。您也可以在已向应用程序上下文注册的 bean 上使用 @PostConstruct 注释,但不能保证在调用该方法时将初始化应用程序的其余部分。如果您希望它在所有内容都设置好后运行,那么 Initializing Bean 方法是您的最佳选择。我已经使用这种策略来启动需要独立于 Web 请求生命周期运行的服务器套接字等。

    【讨论】:

    • 感谢您的回复。wat 关于您对答案的看法。 stackoverflow.com/questions/8686507/…
    • @KitePlayer 也可以。这取决于您是需要通知多种类型的应用程序事件还是只需要启动。
    • 我需要做一些任务,只有在我的 tomcat 启动后一次......最好的方法是什么?
    • @KitePlayer 我会按照我描述的方式进行。 (事实上​​,我实际上已经按照我描述的方式完成了!;))
    • 感谢并成功实现了您的 ide 并且工作正常。
    【解决方案2】:

    你为什么要自己初始化spring应用程序? Spring会自动为你做: 这就是你告诉你的服务器初始化spring的方式:

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/app.xml</param-value>
      </context-param>
    
      <listener>
            <listener-class>
                org.springframework.web.context.ContextLoaderListener
            </listener-class>
      </listener>
    

    这将在部署期间发生,并且所有 bean 都在那里定义并将被初始化(取决于惰性)。 如果您真的想在 bean 初始化后做某事,请在使用之前使用 InitializingBean 示例是

    MyBean implements InitializingBean{
       afterPropertiesSet() {
    
          //do here
       }
    
    }
    

    【讨论】:

    • 通过ContextLoaderListener 初始化应用程序可能不是一个好主意。最好配置您的 DispatcherServlet 并仅在您需要上下文的地方通过 ContextLoaderListener 委派特定任务。
    • 为什么这是个坏主意? Spring 框架本身自带了这个监听器,推荐你使用它来加载它。 DispatcherServlet是给mvc的,mvc不到框架本身的10%,如果我不想用mvc怎么办?
    【解决方案3】:

    ContextLoaderListener 是启动 Spring 的 WebApplicationContext 的引导程序,而 ApplicationListener 更多的是在 java 应用程序级别本身,而不是在 Web 应用程序上下文。

    如果ContextLoaderListener 有多个DispatcherServlets 或映射到不同服务的一些servlet/servlet 过滤器,那么ContextLoaderListener 是一个很好的标准工具,可用于上下文化您的应用程序。基本上,为此类应用程序的不同 servlet 设置侦听器很方便,这样您就可以进行细粒度的上下文化。

    我不知道您正在构建的应用程序的性质,但我假设您目前正在尝试一些基本的东西。如果是这种情况,即使在您有更复杂的设置的情况下,最好在启动时加载一个控制器来处理您的主要初始化例程,包括您的上下文化。您可以在 web.xml 中使用具有类似内容的控制器 bean:

    <servlet>
        <servlet-name>your-servlet</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    

    每当您读取某个 url 模式时,也可以映射和调用此 servelt 例如

    @RequestMapping("/welcome")         
        public ModelAndView helloWorld() 
    

    而在 web 部署描述符中,这一点就像您将 servlet 映射到 Spring Security 等其他 Spring 服务:

    <servlet-mapping>
        <servlet-name>crunchify</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>
    

    因此,您实际上不需要使用控制器的构造函数,也不需要总是使用ContextLoaderListener 或其他侦听器来执行简单的初始化任务。尽管如此,学习它们的用例还是很方便的,因为您在扩展应用程序时会需要它。

    在此处阅读有关调度程序 servlet 的更多信息:

    http://static.springsource.org/spring/docs/3.2.x/javadoc-api/org/springframework/web/servlet/DispatcherServlet.html

    【讨论】:

    • 不想用mvc,又想加载spring怎么办?
    • 他说他已经做了一个控制器,而且很可能已经走上了 mvc 的道路。在此处查看有关此问题的更多详细信息 link:“最好将中间层服务(例如业务逻辑组件和数据访问类(通常在 ApplicationContext 中定义))与 Web 相关组件明确分离例如控制器和视图解析器(在每个 Dispatcher Servlet 的 WebApplicationContext 中定义)。”
    【解决方案4】:

    您可以通过使用带有@PostConstruct 的bean 并在spring 中注入您的servlet-config 来做到这一点。看看代码here 和底部的一行。

    <beans:bean id="PlayerImportDaoImpl"
            class="com.footieview.app.importer.dao.PlayerImportDaoImpl" />
    

    这将在启动时注入此 bean,此 bean 上的方法具有注释 @PostConstruct - 这意味着在启动时此方法被调用。

    【讨论】:

      【解决方案5】:

      创建一个 Spring 3 MVC 应用程序,您不需要这样做!

      Spring MVC 支持 JSP,您可以通过 Annotations 进行所有配置

      有关示例,请参阅 http://fruzenshtein.com/spring-mvc-creation-of-simple-controller-with-java-based-config/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-30
        相关资源
        最近更新 更多