虽然精通Spring和SpringMVC框架,Spring-boot也一直关注,只是项目情况没具体自己从搭框架开始使用,这次终于准备使用Spring-boot搭建个小系统,记录下这个过程中的一些问题与心得;

首先仅仅用maven引入:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
    <version>2.0.0.RELEASE</version>
</dependency>

使用如下代码启动后 进程很快就结束,而以前的WEB项目能够正常的监听网络端口,将程序hold。

@SpringBootApplication
public class PlazaApplication {

    /**
     * @param args 参数
     */
    public static void main(String[] args) {
        SpringApplication.run(PlazaApplication.class, args);
    }
}

这时在maven中加入如下依赖,再次启动程序后,发现项目变成了WEB项目,观察jar导入情况会发现加入和很多web相关的jar

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
	<version>2.0.0.RELEASE</version>
</dependency>

这时打断点跟踪代码,发现在SpringAppliction.java的createApplicationContext方法创建 ConfigurableApplicationContext 过程中会根据项目类型使用不同的ApplicationContext初始化IOC容器,在deduceWebApplicationType方法中会根据Class判断项目类型

	private WebApplicationType deduceWebApplicationType() {
		if (ClassUtils.isPresent(REACTIVE_WEB_ENVIRONMENT_CLASS, null)
				&& !ClassUtils.isPresent(MVC_WEB_ENVIRONMENT_CLASS, null)) {
			return WebApplicationType.REACTIVE;
		}
		for (String className : WEB_ENVIRONMENT_CLASSES) {
			if (!ClassUtils.isPresent(className, null)) {
				return WebApplicationType.NONE;
			}
		}
		return WebApplicationType.SERVLET;
	}	

从代码中可以看出Spring-boot根据jar包中是否存在某些类来判断项目类型,项目类型一共有 REACTIVE、SERVLET、NONE 三种。
REACTIVE、SERVLET两种会内置web容器会以web程序进行启动,NONE则不是个web程序执行完成后进程就结束。

所以如果使用spring-boot启动为web项目必须要引入 spring-boot-starter-web 的jar
如果不是个web项目,而是个有界面的桌面项目,启动程序也需要略作修改

    /**
     * @param args 参数
     */
    public static void main(String[] args) {
        SpringApplicationBuilder builder = new SpringApplicationBuilder(PlazaApplication.class);
        builder.headless(false).web(WebApplicationType.NONE).run(args);
    }

headless设置为false很重要,否则初始化 AWT 会抛出java.awt.HeadlessException的异常!

打赏
Spring-boot启动过程之ApplicationContext
Tagged on:         

发表评论