spring boot 简介
spring boot是为了简化spring的开发, 不需要进行大量的配置, 是由pivotal公司提供的全新框架
为什么使用spring boot
独立运行
简化配置
自动配置
无需xml配置
spring boot核心配置文件
application和bootstrap
application用于spring的自动化配置
bootstrap: 使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
配置文件格式:
.properties和.yml
注: .yml 格式不支持 @PropertySource 注解导入配置
springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件
如果在不同的目录中存在多个配置文件,它的读取顺序是:
注: bootstrap配置文件是优先级最高的.
config/application.properties(项目根目录中config目录下)
config/application.yml
application.properties(项目根目录下)
application.yml
resources/config/application.properties(项目resources目录中config目录下)
resources/config/application.yml
resources/application.properties(项目的resources目录下)
resources/application.yml
优先级由高到底,高优先级的配置会覆盖低优先级的配置;
SpringBoot会从这四个位置全部加载主配置文件;互补配置;
我们还可以通过spring.config.location来改变默认的配置文件位置
开启spring boot特性
继承spring-boot-starter-parent项目
spring-boot-dependencies项目依赖
读取配置文件方式
@PropertySource + @Value
@Value
Environment
@Inject
private Enviroment env;
@ConfigurationProperties
@ConfigurationProperties(prefix = "db")
actuator(激励者,执行器)
添加依赖“compile ‘org.springframework.boot:spring-boot-starter-actuator’”
actuator默认只开启了health和info
http://localhost:9210/health
http://localhost:9210/info
可观察工程的信息
profile使用
spring.profiles.active=dev/qa/prod 选择不同的环境
@Profile("")放在实现类上可以让不同环境运行不同的代码(如发短信), 如用Redis和Amazon 实现两套SQS, 一套用于qa, 一套用于prod
springboot 日志控制
spring boot 中使用的日志技术为logback,和log4j的作者相同,性能要优于Log4j,spring-boot-starter-logging,不用显式添加, 因为被spring-boot-starter-web所依赖
使用时只用在配置文件中添加
logging.pattern.console=
logging.level.root=
并在资源文件下添加logback.xml
spring boot核心注解
SpringBootApplication注解
元注解(@Target, @Retention, @Documented, @Inherited),可以对注解进行注解的注解
@SpringBootConfigurtaion, 和Configuration注解功能一样
@ComponentScan
basePackages: 若没有指定则扫描当前注解所标的类所在的包及其子孙包
includeFilters 和 excludeFilters
@Enable***,导入配置类的常见方式有三种:
以Configuration结尾,EnableScheduling —> @Import(SchedulingConfiguration.class)
根据条件选择配置类,以ConfigurationSelector结尾,且实现了ImportSelector接口.
动态注册bean,以Registar结尾,且该类实现了ImportBeanDefinitionRegistar接口.用于表示在运行代码时,若用到了该配置类, 则系统会自动将其导入.
@EnableAutoConfiguration
@AutoConfigurationPackage, 用于导入并装配用户自定义的类,即自动扫描包中的类
@Import 用于导入并装配框架本身的类
spring boot starter简介
starter相当于是一个模块, 整合了模块所需的依赖. 使用者只需依赖相应功能的starter,无需做过多的配置或依赖, springboot就能自动扫描并加载相应的模块.
如对spring web(spring mvc)的使用:spring-boot-starter-web
手写starter流程
以新建一个es-starter为例
新建一个gradle/maven项目
创建ElasticSearchProperties @ConfigurationProperties(prefix = "sxw.elasticsearch")
public class ElasticSearchProperties {
private String clusterName = "elasticsearch";
private String clusterNodes = "127.0.0.1:9300";
private String userName = "elastic";
private String password = "changeme";
// get/set
}
创建配置类 @Configuration
@EnableConfigurationProperties(ElasticSearchProperties.class)
public class ElasticSearchAutoConfiguration {
// 根据ElasticSearchProperties中的属性, 创建ES client
}
新建spring.factories文件,指定Starter的自动装配类,spring.factories文件位于resources/META-INF目录下
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.sxw.commons.data.es.starter.ElasticSearchAutoConfiguration
ApplicationRunner 和 CommandLineRunner
CommandLineRunner和ApplicationRunner接口的run()方法在SpringApplication完成启动时执行。启动完成之后,应用开始运行. CommandLineRunner和ApplicationRunner的作用是在程序开始运行前执行任务或记录信息.
spring boot 事务管理原理
在application启动类上添加EnableTransactionManagement注解
在事务方法上添加@Transactional(rollbackFor = Exception.class)
springboot的事务管理是通过autoconfigure来决定的.
如jpa, 是通过引入的HibernateJpaAutoConfiguration来实现的, HibernateJpaAutoConfiguration也是一个spring boot starter.
Spring 事务管理的核心接口是PlatformTransactionManager, 这个接口有几个常使用的实现策略: HibernateTransactionManager, DataSourceTransactionManager, JpaTransactionManager等.
PlatformTransactionManager中定义了3个方法:
根据TransactionDefinition 中定义的事务传播机制(propagation), 事务隔离级别(isolation), 事务超时时间(timeout), 是否是只读事务(is read only)来获取一个事务
TransactionStatus getTransaction(TransactionDefinition definition)
提交事务
void commit(TransactionStatus status)
回滚事务
void rollback(TransactionStatus status)
springboot @Transactional注解
让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)
让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
事务传播机制(注: 方法存在于一个事务中是指存在方法调用)
REQUIRED: 业务方法需要在一个容器里运行。如果方法运行时,已经处在一个事务中,那么加入到这个事务,否则自己新建一个新的事务
NOT_SUPPORTED: 声明方法不需要事务。如果方法没有关联到一个事务,容器不会为他开启事务,如果方法在一个事务中被调用,该事务会被挂起,调用结束后,原先的事务会恢复执行
REQUIRESNEW: 不管是否存在事务,该方法总汇为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务挂起,新的事务被创建
MANDATORY: 该方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果在没有事务的环境下被调用,容器抛出异常
SUPPORTS: 该方法在某个事务范围内被调用,则方法成为该事务的一部分。如果方法在该事务范围外被调用,该方法就在没有事务的环境下执行
NEVER: 该方法绝对不能在事务范围内执行。如果在就抛异常。只有该方法没有关联到任何事务,才正常执行
NESTED: 如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效
spring boot @Schedule注解
fixedDelay: 上一次执行结束与下一次执行开始间隔的时间
fixedRate: 上一次执行与下一次执行间隔的时间
initialDelay: 第一次执行需要等待的时间