Springboot快速上手
基于Springboot 2.0.0.RELEASE 版本
1. System Requirement
1. Java8 or higher
2. Spring Framework 5.0.4.RELEASE or higher□
3. Maven3.2 or higher
4. Servlet Container: Springboot embedded:
name |
Servlet Version |
Tomcat8.5(general) |
3.1 |
Jetty9.4 |
3.1 |
Undertow1.4 |
3.1 |
同时也支持部署到其它Servlet3.0+的容器中
2. 从hello world开始
1. 创建maven项目
2. springboot起步依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‑boot‑starter‑parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‑boot‑starter‑web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‑boot‑starter‑test</artifactId>
</dependency>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‑boot‑maven‑plugin</artifactId>
</plugin>
3. 构建项目结构
4. DemoApplication(启动类)
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class,args);
}
}
5. HelloController
@RestController
public class HelloController {
@GetMapping("/hello")
public ResponseEntity<String> hello(){
return new ResponseEntity<>("hello world", HttpStatus.OK);
}
}
3. 配置文件
同时支持yml和properties格式配置文件
支持通配符:application*.yml或application*.properties 加载顺序:
1.在命令行中传入的参数
2.SPRING_APPLICATION_JSON中的属性。SPRING_APPLICATION_JSON是以JSON格式配置在系统环境变量中的
3. java:comp/env中的JNDI属性
4. Java的系统属性,可以通过System.getProperties()获得的内容
5. 操作系统的环境变量
6. 通过random.*配置的随机属性
7. 位于当前应用jar包之外,针对不同{profile}环境的配置文件内容,例如application‑{profile}.properties或是YAML定义的配置文件
8. 位于当前应用jar包之内,针对不同{profile}环境的配置文件内容,例如application‑{profile}.properties或是YAML定义的配置文件
9. 位于当前应用jar包之外的application.properties和YAML配置内容
10. 位于当前应用jar包之内的application.properties和YAML配置内容
11. @Configuration注解修改的类中,通过@PropertySource注解定义的属性
12. 应用默认属性,使用SpringApplication.setDefaultProperties定义的内容
4. 日志
Springboot默认集成的是logback,只会输出到控制台
可以在application配置文件中配置输出为日志文件(简单配置)
如果想进行日志文件切割等复杂配置,可以自定义logback配置文件
在resource下写入logback‑spring.xml文件,即可以被springboot加载
5. 配置数据库连接池与ORM框架
Springboot2.0以后,默认集成HikariCP数据库连接池 引入druid连接池和mybatis框架
添加依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid‑spring‑boot‑starter</artifactId>
<version>1.1.9</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis‑spring‑boot‑starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql‑connector‑java</artifactId>
</dependency>
配置文件:
spring:
datasource:
url: jdbc:mysql://localhost:3306/toon?useSSL=false
username: root
password: 123456
driver‑class‑name: com.mysql.jdbc.Driver
mybatis:
config‑location: classpath:mybatis/mybatis‑config.xml
mapper‑locations: classpath:mapper/*Mapper.xml
6. 事务
通过注解@Transactional开启事务
可以加在类上,表示整个类的方法都是开启事务的,一般是更细粒度的加在方法(public 方法)上,表示这个方法是开启事务的
@Transactional的参数:
name |
description |
readOnly |
该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读 写,默认值为false。例如:@Transactional(readOnly=true) |
|
|
rollbackFor |
该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如: 指定单一异常类:@Transactional(rollbackFor=RuntimeException.class) 指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class}) |
rollbackForClassName |
该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如: 指定单一异常类名称: @Transactional(rollbackForClassName="RuntimeException") 指定多个异常类名称:@Transactional(rollbackForClassName= {"RuntimeException","Exception"}) |
noRollbackFor |
该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如: 指定单一异常类: @Transactional(noRollbackFor=RuntimeException.class) 指定多个异常类:@Transactional(noRollbackFor= {RuntimeException.class, Exception.class}) |
noRollbackForClassName |
该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如: 指定单一异常类名称: @Transactional(noRollbackForClassName="RuntimeException") 指定多个异常类名称: @Transactional(noRollbackForClassName= {"RuntimeException","Exception"}) |
propagation |
指定事务的传播行为: @Transactional(propagation=Propagation.REQUIRED) :如果有事务, 那么加 入 事 务 , 没 有 的 话 新 建 一 个 ( 默 认 情 况 下 ) @Transactional(propagation=Propagation.NOT_SUPPORTED) : 容 器 不 为这个方法开启事务@Transactional(propagation=Propagation.REQUIRES_NEW) :不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务@Transactional(propagation=Propagation.MANDATORY) :必须在一个已有的事务中执行,否则抛出异常@Transactional(propagation=Propagation.NEVER) :必须在一个没有的事务 中 执 行 , 否 则 抛 出 异 常 ( 与 Propagation.MANDATORY 相 反 ) @Transactional(propagation=Propagation.SUPPORTS) :如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就 不用事务. |
isolation |
该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置
@Transactional(isolation = Isolation.READ_UNCOMMITTED):读取未提交数据(会出现脏读, 不可重复读) 基本不使用 @Transactional(isolation = Isolation.READ_COMMITTED):读取已提交数据(会出现不可重复读和幻读) |
|
@Transactional(isolation = Isolation.REPEATABLE_READ):可重复读(会出现幻读) @Transactional(isolation = Isolation.SERIALIZABLE):串行化 |
timeout |
该属性用于设置事务的超时秒数,默认值为‑1表示永不超时 |
7. 统一全局异常处理
通过注解@ControllerAdvice标注一个类为全局异常处理类
通过@ExceptionHandler标注一个方法为处理某异常的handler方法在方法中,可以自定义返回参数格式和内容
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler({UserInvalidException.class})
public ResponseEntity<Response> handlerUserValidException(UserInvalidException e){
return new ResponseEntity<>(new Response(HttpStatus.BAD_REQUEST.value(),e.getMessage()),HttpStatus.BAD_RE
}
}
8. 依赖注入
Springboot使用JavaConfig的方式将指定的bean注入到IOC容器中,而不再使用xml配置的方式
JavaConfig方式通过注解@Configuration和@Bean来实现
任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器,方法名将默认成该bean定义 的id
可以类比于spring中xml的:
<beans>
<bean><bean>
</beans>
9. 依赖注入springboot提供的线程池通
过@EnableAsync开启异步
通过@Bean将ThreadPoolTaskExecutor注入
@Configuration @EnableAsync
public class ExecutorConfig {
@Bean
public ThreadPoolTaskExecutor asyncServiceExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10); executor.setQueueCapacity(5000);
executor.setThreadNamePrefix("async‑service‑");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
}
10. 容器
Springboot默认内置Servlet容器Tomcat8.5
可以通过下面的方式替换为其他的容器:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‑boot‑starter‑web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‑boot‑starter‑tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‑boot‑starter‑jetty</artifactId>
</dependency>
在使用内置容器后,可以直接打包成可以运行的jar,引入下面的插件:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‑boot‑maven‑plugin</artifactId>
</plugin>
同时也可以打成war包,部署到外置的Servlet容器中
1. POM中增加配置:
<packaging>war</packaging>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‑boot‑starter‑web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‑boot‑starter‑tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‑boot‑starter‑tomcat</artifactId>
</dependency>
2. 增加ServletInitializer,将启动类引导注册,外部Web Application Context构建时,会添加启动类
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(DemoApplication.class);
}
}
11. 起步依赖和自动配置
启动类注解@SpringbootApplication:
组合注解,相当于三个: @SpringbootConfiguration @EnableAutoConfi[email protected]
@SpringbootConfiguration 相当于@Configuration
1. @Configuration
JavaConfig的配置方式,被标注的类就被认为是IoC容器的配置类进行加载 所以启动类也就是一个IoC容器配置类
2. ComponentScan
组件扫描配置,将符合要求的组件扫描然后加入IoC容器中
可以通过属性scanBasePackages来更细粒度的指定扫描范围
默认情况是扫描子包下的组件,所以启动类一般就放在rootpackage下
3. EnableAutoConfiguration
通过@Import注解,将所有符合自动配置条件的bean加载到IoC容器中:
@Import({AutoConfigurationImportSelector.class})
自动配置的关键就是 AutoConfigurationImportSelector借助于Spring的工具类SpringFactoriesLoader
SpringFactoriesLoader主要功能就是从指定的配置文件META‑INF/spring.factories加载配置
配合@EnableAutoConfiguration使用的话,它更多是提供一种配置查找的功能支持,即根据
@EnableAutoConfiguration的完整类名org.springframework.boot.autoconfigure.EnableAutoConfiguration
作为查找的Key,获取对应的一组@Configuration类
整个过程大致为:
从classpath中搜寻所有的META‑INF/spring.factories配置文件,并将其中
org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器
SpringApplication.run()方法基本过程:
1. 方法中首先要创建一个SpringApplication对象实例,然后调用这个创建好的SpringApplication的实例方法。在
SpringApplication实例初始化的时候,它会提前做:
1> 根据classpath里面是否存在某个特征类
(org.springframework.web.context.ConfigurableWebApplicationContext)来决定是否应该创建一个为Web 应用使用的ApplicationContext类型
2> 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationContextInitializer
3> 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationListener
4> 推断并设置main方法的定义类
2. SpringApplication实例初始化完成并且完成设置后,执行run方法的逻辑,首先遍历执行所有通过
SpringFactoriesLoader可以查找到并加载的SpringApplicationRunListener。调用它们的started()方法,相当于通知它们Springboot要准备开始启动了
3. 创建并配置当前Spring Boot应用将要使用的Environment(包括配置要使用的PropertySource以及Profile)
4. 遍历调用所有SpringApplicationRunListener的environmentPrepared()的方法,通知它们Springboot的Enviroment已经准备好了
5. 如果SpringApplication的showBanner属性被设置为true,则打印banner
6. 根据用户是否明确设置了applicationContextClass类型以及初始化阶段的推断结果,决定该为当前SpringBoot应用创建什么类型的ApplicationContext并创建完成,然后根据条件决定是否添加ShutdownHook,决定是否使用自定义的BeanNameGenerator,决定是否使用自定义的ResourceLoader;最重要的是将之前准备好的Environment设 置给创建好的ApplicationContext使用。
7. ApplicationContext创建好之后,SpringApplication会再次借助SpringFactoriesLoader,查找并加载classpath中所有可用的ApplicationContext‑Initializer,然后遍历调用这些ApplicationContextInitializer的initialize(applicationContext)方法来对已经创建好的ApplicationContext进行进一步的处理
8. 遍历调用所有SpringApplicationRunListener的contextPrepared()方法
9. 整个启动中最关键的步骤:将之前通过@EnableAutoConfiguration获取的所有配置以及其他形式的IoC容器配置加载到已经准备完毕的ApplicationContext
10. 遍历调用所有SpringApplicationRunListener的contextLoaded()方法
11. 调用ApplicationContext的refresh()方法,完成IoC容器可用的最后一道工序
12. 查找当前ApplicationContext中是否注册有CommandLineRunner,如果有,则遍历执行
13. 正常情况下,遍历执行SpringApplicationRunListener的finished()方法,如果整个过程出现异常,则依然调用所 有SpringApplicationRunListener的finished()方法,只不过这种情况下会将异常信息一并传入处理
说明:官方文档永远是最好的入门教程。
如果您觉得博主写的文章对您有帮助,可以请博主喝杯茶哦,O(∩_∩)O~
博主:诸葛本不亮
简介:毕业后做过多年程序猿、架构设计、项目经理、部门总监,待过传统软件公司,也在大型互联网公司负责过平台研发部,在这个行业浸淫十多年,在系统架构、SaaS平台搭建、项目管理以及部门管理等方面有着多年的一线实践经验。
目前与好友合伙创办了一个软件工作室,提供各类系统解决方案、咨询服务及技术合作,企业软件(SaaS平台、企业应用、商城、微信公众号及小程序开发)定制开发服务,大数据服务(数据采集及清洗、数据分析等),以及程序猿职业规划及转型咨询服务(程序猿转架构师、转项目管理、转技术管理等,可以提供相应的一线资料帮助您成功转型,获得大厂offer)。
微信号:danwang2138