简介
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
官网地址:http://projects.spring.io/spring-boot/
搭建spring boot项目
spring boot项目例子已经上传至码云:https://gitee.com/imlichao/SpringBoot-example
1、使用maven创建基础spring boot项目
spring boot可以使用Maven或Gradle 进行安装。由于本人对Gradle不是很熟所以在这里只介绍maven的安装方式。
其实我们可以新建一个普通的maven项目,然后通过在pom文件中添加spring boot依赖来创建。
但是maven中给我们提供了很多工程模板,既然提供了这么多的模板我们为什么不用呢,下面的例子将使用maven模板直接创建一个spring boot项目。
# 构建maven项目(项目目录名称与artifactId所指定的名称一致)
mvn archetype:generate -D groupId=pub.imlichao -D artifactId=SpringBoot-example
# 选择模板(4号为基础spring boot模板)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 1052: 4
通过以上命令我们就创建了一个基本的spring boot项目
当然这个项目为我们搭建好了大部分的结构,当然内容须要我们自己稍作调整才能正常使用。
2、调整pom文件
调整spring boot版本
模板中的spring boot版本往往比较落后,我们如果需要使用新的版本则需要在pom文件中进行调整。
在pom.xml文件中修改spring boot版本
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.7.RELEASE</version>
</parent>
增加freemaker依赖
本配置不是必要项由于本人习惯于使用freemaker所以在此增加。
<dependencies>
<!-- 增加freemarker依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
</dependencies>
去掉不需要的依赖
去掉本次项目不需要的内容,去掉的内容因项目而异
最终调整完的pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>pub.imlichao</groupId>
<artifactId>SpringBoot-example</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<!-- 继承Spring Boot-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.7.RELEASE</version>
</parent>
<dependencies>
<!-- 增加web项目依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 增加freemarker依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
</dependencies>
<!-- 打包成可执行的jar包 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3、调整配置文件
application.properties配置文件在resources资源目录下。
本例子只需要端口号,所以删除其他配置增加端口号配置。
# Server HTTP port.
server.port=8090
4、创建业务代码和页面代码
不知道为什么模板代码是不能够执行的,所以删除模板代码编写自己的测试代码。
业务代码类HelloController
package pub.imlichao;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping(value = "/")
public String hello(){
return "/hello";
}
}
freemaker页面hello.ftl
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>hello world</title>
</head>
<body>
<h1>hello world</h1>
</body>
</html>
5、调整后的项目结构
6、启动执行
"C:\Program Files\Java\jdk1.8.0_65\bin\java" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:58673,suspend=y,server=n -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_65\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\rt.jar;D:\workspaces\SpringBoot-example\target\classes;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-web\1.5.7.RELEASE\spring-boot-starter-web-1.5.7.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter\1.5.7.RELEASE\spring-boot-starter-1.5.7.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot\1.5.7.RELEASE\spring-boot-1.5.7.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\1.5.7.RELEASE\spring-boot-autoconfigure-1.5.7.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-logging\1.5.7.RELEASE\spring-boot-starter-logging-1.5.7.RELEASE.jar;C:\Users\Administrator\.m2\repository\ch\qos\logback\logback-classic\1.1.11\logback-classic-1.1.11.jar;C:\Users\Administrator\.m2\repository\ch\qos\logback\logback-core\1.1.11\logback-core-1.1.11.jar;C:\Users\Administrator\.m2\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;C:\Users\Administrator\.m2\repository\org\slf4j\jcl-over-slf4j\1.7.25\jcl-over-slf4j-1.7.25.jar;C:\Users\Administrator\.m2\repository\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;C:\Users\Administrator\.m2\repository\org\slf4j\log4j-over-slf4j\1.7.25\log4j-over-slf4j-1.7.25.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-core\4.3.11.RELEASE\spring-core-4.3.11.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\yaml\snakeyaml\1.17\snakeyaml-1.17.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\1.5.7.RELEASE\spring-boot-starter-tomcat-1.5.7.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\8.5.20\tomcat-embed-core-8.5.20.jar;C:\Users\Administrator\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\8.5.20\tomcat-embed-el-8.5.20.jar;C:\Users\Administrator\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\8.5.20\tomcat-embed-websocket-8.5.20.jar;C:\Users\Administrator\.m2\repository\org\hibernate\hibernate-validator\5.3.5.Final\hibernate-validator-5.3.5.Final.jar;C:\Users\Administrator\.m2\repository\javax\validation\validation-api\1.1.0.Final\validation-api-1.1.0.Final.jar;C:\Users\Administrator\.m2\repository\org\jboss\logging\jboss-logging\3.3.1.Final\jboss-logging-3.3.1.Final.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\classmate\1.3.4\classmate-1.3.4.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.8.10\jackson-databind-2.8.10.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.8.0\jackson-annotations-2.8.0.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.8.10\jackson-core-2.8.10.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-web\4.3.11.RELEASE\spring-web-4.3.11.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-aop\4.3.11.RELEASE\spring-aop-4.3.11.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-beans\4.3.11.RELEASE\spring-beans-4.3.11.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-context\4.3.11.RELEASE\spring-context-4.3.11.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-webmvc\4.3.11.RELEASE\spring-webmvc-4.3.11.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-expression\4.3.11.RELEASE\spring-expression-4.3.11.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-freemarker\1.5.7.RELEASE\spring-boot-starter-freemarker-1.5.7.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\freemarker\freemarker\2.3.26-incubating\freemarker-2.3.26-incubating.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-context-support\4.3.11.RELEASE\spring-context-support-4.3.11.RELEASE.jar;D:\Program Files\IntelliJ IDEA Community Edition 2017.1.4\lib\idea_rt.jar" pub.imlichao.App
Connected to the target VM, address: '127.0.0.1:58673', transport: 'socket'
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.5.7.RELEASE)
2017-09-28 14:18:00.828 INFO 7444 --- [ main] pub.imlichao.App : Starting App on 7WLOAFTSGWIIGSD with PID 7444 (D:\workspaces\SpringBoot-example\target\classes started by Administrator in D:\workspaces\SpringBoot-example)
2017-09-28 14:18:00.832 INFO 7444 --- [ main] pub.imlichao.App : No active profile set, falling back to default profiles: default
2017-09-28 14:18:00.920 INFO 7444 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@68c72235: startup date [Thu Sep 28 14:18:00 CST 2017]; root of context hierarchy
2017-09-28 14:18:02.739 INFO 7444 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8090 (http)
2017-09-28 14:18:02.757 INFO 7444 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2017-09-28 14:18:02.758 INFO 7444 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.20
2017-09-28 14:18:02.911 INFO 7444 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2017-09-28 14:18:02.912 INFO 7444 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1996 ms
2017-09-28 14:18:03.082 INFO 7444 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
2017-09-28 14:18:03.085 INFO 7444 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*]
2017-09-28 14:18:03.086 INFO 7444 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2017-09-28 14:18:03.086 INFO 7444 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2017-09-28 14:18:03.086 INFO 7444 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*]
2017-09-28 14:18:03.447 INFO 7444 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@68c72235: startup date [Thu Sep 28 14:18:00 CST 2017]; root of context hierarchy
2017-09-28 14:18:03.531 INFO 7444 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/],methods=[GET]}" onto public java.lang.String pub.imlichao.HelloController.hello()
2017-09-28 14:18:03.534 INFO 7444 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2017-09-28 14:18:03.535 INFO 7444 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2017-09-28 14:18:03.575 INFO 7444 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-09-28 14:18:03.575 INFO 7444 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-09-28 14:18:03.625 INFO 7444 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-09-28 14:18:03.866 INFO 7444 --- [ main] o.s.w.s.v.f.FreeMarkerConfigurer : ClassTemplateLoader for Spring macros added to FreeMarker configuration
2017-09-28 14:18:04.122 INFO 7444 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2017-09-28 14:18:04.214 INFO 7444 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8090 (http)
2017-09-28 14:18:04.222 INFO 7444 --- [ main] pub.imlichao.App : Started App in 3.775 seconds (JVM running for 4.304)
项目配置
spring boot项目可以在配置文件中方便的进行项目各项属性的配置。比如上面的例子中就在配置文件中进行了端口号的配置。
默认情况下配置文件会放在resources资源目录下,命名为application.properties。
不同环境下我们可能需要使用不同的配置,那么可以创建多个配置文件并在项目启动时指定要使用的配置文件。例如:配置文件命名为application-test.properties作为测试环境的配置,启动参数增加 --spring.profiles.active=test 。项目就会使用application-test.properties配置文件启动。 |
下面介绍一些常用的配置,更多配置请参考官方文档:
https://docs.spring.io/spring-boot/docs/1.5.7.RELEASE/reference/htmlsingle/#appendix
server.port=8080 #项目端口号
management.port=8081 #项目管理端口号。不配置时默认与server.port一致。例如使用actuator时就要访问此端口
server.tomcat.max-threads=500 #tomcat最大线程数
server.tomcat.min-spare-threads=25 #tomcat最小线程数
server.tomcat.uri-encoding=UTF-8 #tomcat URI字符编码
server.tomcat.accept-count=100 #tomcat最大等待线程数
server.compression.enabled=true #是否对请求响应进行gzip压缩。
server.compression.mime-types=text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml #需要压缩的响应类型。
spring.datasource.url=jdbc:mysql://rm-2ze4k2hch0pa4ie75.mysql.rds.aliyuncs.com:3306/mfqy-production?zeroDateTimeBehavior=convertToNull #数据库连接URL
spring.datasource.username=admin #数据库连接用户名
spring.datasource.password=111111 #数据库连接密码
spring.datasource.driverClassName=com.mysql.jdbc.Driver #数据库驱动类名称
spring.jpa.generate-ddl=true #是否使用hibernate hbm2ddl控制数据库
spring.jpa.hibernate.ddl-auto=update #hbm2ddl自动控制数据库类型 (validate | update | create | create-drop)
spring.jpa.showSql=false #是否记录sql日志
常用注解
@SpringBootApplication
使用此注解相当于同时增加了@Configuration, @EnableAutoConfiguration 和 @ComponentScan三个注解
@SpringBootApplication // 包含了 @Configuration @EnableAutoConfiguration @ComponentScan 三个注解
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
@Configuration
此注解声明了当前类是一个java形式的配置文件类。在早期的的项目中常使用XML形式的配置类,在spring boot中我们需要使用这种方式。
两种方式没有实质上的区别只是写法不同而已,掌握规律后我们可以将XML形式的配置文件“翻译”成java形式。
/**
* HikariCP连接池配置
*/
@Configuration
public class DataSourceConfig {
private static final Logger logger = LoggerFactory.getLogger(DataSourceConfig.class);
@Value("${spring.datasource.url}")
private String dataSourceUrl;
@Value("${spring.datasource.username}")
private String user;
@Value("${spring.datasource.password}")
private String password;
@Bean
public DataSource primaryDataSource() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl(dataSourceUrl);
config.setUsername(user);
config.setPassword(password);
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
HikariDataSource ds = new HikariDataSource(config);
return ds;
}
}
/**
* Tomcat 配置
*/
@Configuration
public class TomcatConfig {
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
tomcat.setProtocol("org.apache.coyote.http11.Http11Nio2Protocol");//nio2 异步非阻塞
return tomcat;
}
}
@EnableAutoConfiguration
这个注释告诉SpringBoot“猜”你将如何想配置Spring,基于你已经添加jar依赖项。如果spring-boot-starter-web已经添加Tomcat和Spring MVC,这个注释自动将假设您正在开发一个web应用程序并添加相应的spring设置。
这样@EnableAutoConfiguration可以从逐层的往下搜索各个加注解的类,例如,你正在编写一个JPA程序(如果你的pom里进行了配置的话),spring会自动去搜索加了@Entity注解的类,并进行调用
@ComponentScan
此注解告诉spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类注册为bean。
@ConfigurationProperties
用于将application配置文件中的参数注入到一个实体类中。
通常我们在需要调用配置文件参数时会通过一个输入流进行读取。
这种方式即占用系统资源又比较麻烦。
例如:
inputStream = ReadApplication.class.getClassLoader().getResourceAsStream(propertiesName);
properties.load(inputStream);
//或者
inputStream = new FileInputStream(file);
properties.load(inputStream);
使用@ConfigurationProperties注解可以方便的将配置文件内容注入到一个实体类中直接使用
例如:
配置文件
spring.datasource.url=jdbc:mysql://rdso30006c33s57oufvfo.mysql.rds.aliyuncs.com:3306/test?&zeroDateTimeBehavior=convertToNull
spring.datasource.username=test
spring.datasource.password=123654
实体类
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix="spring.datasource")
public class SpringDatasourceSettings {
private String url;
private String username;
private String password ;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
注入并使用
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
public class TestEndPoint {
@Autowired
SpringDatasourceSettings springDatasourceSettings;
@RequestMapping(value = "v1.0/test", method = RequestMethod.POST)
public String test( HttpServletRequest request) {
System.out.println("openapi test : " + springDatasourceSettings.getUrl());
System.out.println("openapi test : " + springDatasourceSettings.getUsername());
System.out.println("openapi test : " + springDatasourceSettings.getPassword());
return "";
}
}