【问题标题】:spring boot - application start twice..?spring boot - 应用程序启动两次..?
【发布时间】:2018-03-28 06:48:47
【问题描述】:

我是 Spring Boot 新手,我的应用程序有 Servlet 和 eh-cache 模块。

@EnableCaching 
@SpringBootApplication 
@ServletComponentScan
public class Application extends SpringBootServletInitializer {

    private static final Logger log = LoggerFactory.getLogger(Application.class);
    public Application() {
        log.info("------------------------------");
        log.info("  Welcome to Application");
        log.info("------------------------------");
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }
}

使用这个,我试图启动应用程序,但它启动了两次..?

        12:11:36,020 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@291e5d10 - Registering current configuration as safe fallback point
    **2018-03-28_12:11:36.204 com.netapp.prj.Application - ------------------------------
    2018-03-28_12:11:36.226 com.ct.prj.Application -   Welcome to Application
    2018-03-28_12:11:36.226 com.ct.prj.Application - ------------------------------**

      .   ____          _            __ _ _
     /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
     \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::        (v2.0.0.RELEASE)

    2018-03-28_12:11:40.371 com.ct.prj.Application - Starting Application on NBC02P05-00063 with PID 904 (H:\projects\prj\prj\target\prj\WEB-INF\classes started by   in C:\Balasundaram\Development\eclipse-jee-oxygen-R-win32-x86_64)
    2018-03-28_12:12:00.103 org.mongodb.driver.cluster - Discovered cluster type of STANDALONE
    2018-03-28_12:12:03.505 o.s.b.w.s.ServletRegistrationBean - Servlet com.ct.prj.config.JerseyConfig mapped to [/services/*]
    2018-03-28_12:12:03.508 o.s.b.w.s.ServletRegistrationBean - Servlet dispatcherServlet mapped to [/]
    2018-03-28_12:12:03.509 o.s.b.w.s.FilterRegistrationBean - Mapping filter: 'characterEncodingFilter' to: [/*]
    2018-03-28_12:12:03.509 o.s.b.w.s.FilterRegistrationBean - Mapping filter: 'errorPageFilter' to: [/*]
    2018-03-28_12:12:03.509 o.s.b.w.s.FilterRegistrationBean - Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
    2018-03-28_12:12:03.510 o.s.b.w.s.FilterRegistrationBean - Mapping filter: 'httpPutFormContentFilter' to: [/*]
    2018-03-28_12:12:03.510 o.s.b.w.s.FilterRegistrationBean - Mapping filter: 'requestContextFilter' to: [/*]
    2018-03-28_12:12:03.511 o.s.b.w.s.FilterRegistrationBean - Mapping filter: 'httpTraceFilter' to: [/*]
    2018-03-28_12:12:03.511 o.s.b.w.s.FilterRegistrationBean - Mapping filter: 'webMvcMetricsFilter' to: [/*]
    **2018-03-28_12:12:03.558 com.ct.prj.Application - ------------------------------
    2018-03-28_12:12:03.559 com.ct.prj.Application -   **Welcome to Application**
    2018-03-28_12:12:03.559 com.ct.prj.Application - ------------------------------**
    2018-03-28_12:12:06.952 o.s.b.a.w.s.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html]

请纠正我在哪里做错了..?

【问题讨论】:

    标签: java spring spring-boot spring-boot-test


    【解决方案1】:

    输出来了两次,但应用程序实际上只启动了一次。

    实际上将创建 2 个实例,这实际上是由于 @SpringBootApplication 注释。或者更准确地说是@Configuration 注释。

    当 Spring 检测到 @Configuration 时,它将为此类创建一个特殊代理。由于这是一个基于类的代理,因此将创建一个新实例,以便能够代理对所有 @Bean 方法的调用(这样您只能获得 bean 的单个实例等)。此代理将包装实际实例。

    但是main 类只会运行一次,代理实例将用于从中获取@Bean 方法。

    【讨论】:

    • 啊,当然 - @Configuration 的基于类的代理 - 忘记了。
    • 其实main方法被执行两次。 main 将被执行一次以启动进程并创建代理,第二次作为代理实例运行应用程序。因此,应用程序启动一次。但是main中的任何代码都会被执行两次。
    • @FlorianF 不,它不会... main 仅由 Java 而非代理框架调用。所以你说的没有道理。
    • 显然“Welcome to Application”被打印了两次。那是因为main 的两个实例被执行了。
    • 不,这不是因为执行了两个 main 实例,而是因为创建了 2 个 bean 实例,因为正在创建一个额外的代理。
    【解决方案2】:

    我观察到与添加 devtools 依赖项相同的情况

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>
    

    devtools 自动刷新上下文。 希望对你有帮助。

    【讨论】:

      【解决方案3】:

      只有类Application 被实例化了两次。该应用程序仅启动一次。

      【讨论】:

        【解决方案4】:

        我必须删除 spring-boot-devtools 的依赖项,然后才能成功启动应用程序。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-04-06
          • 2019-10-05
          • 2019-12-19
          • 2018-01-05
          • 2015-05-10
          • 2020-08-04
          相关资源
          最近更新 更多