虽然精通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的异常!