SpringBoot基础配置
一、程序启动
1.创建一个maven工程,pom依赖添加
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!-- 这个插件,可以将应用打包成一个可执行的jar包 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2.主启动类
@SpringBootApplication
public class HelloWorldMainApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldMainApplication.class,args);
}
}
3.相关介绍
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
- spring-boot-starter:spring-boot场景启动器;帮我们导入了web模块正常运行所依赖的组件;
- SpringBoot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器。
@SpringBootApplication
public class HaloWorldApplication
@SpringBootApplication:SpringBoot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来启动SpringBoot应用。
二、配置相关
1.配置文件分类
SpringBoot支持三种格式的配置文件。分别如下:
- properties格式
- yml格式(主流格式)
- yaml格式
1.1application.yml
这是Spring Boot默认的配置文件,它采用YAML格式而不是.properties格式,文件名必须是application.yml而不是其他名称。
YAML格式比key=value格式的.properties文件更易读。比较一下两者的写法:
使用.properties格式:
# application.properties
spring.application.name=${APP_NAME:unnamed}
spring.datasource.url=jdbc:hsqldb:file:testdb
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.hsqldb.jdbc.JDBCDriver
spring.datasource.hikari.auto-commit=false
spring.datasource.hikari.connection-timeout=3000
spring.datasource.hikari.validation-timeout=3000
spring.datasource.hikari.max-lifetime=60000
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=1
使用YAML格式:
# application.yml
spring:
application:
name: ${APP_NAME:unnamed}
datasource:
url: jdbc:hsqldb:file:testdb
username: sa
password:
driver-class-name: org.hsqldb.jdbc.JDBCDriver
hikari:
auto-commit: false
connection-timeout: 3000
validation-timeout: 3000
max-lifetime: 60000
maximum-pool-size: 20
minimum-idle: 1
可见,YAML是一种层级格式,它和.properties很容易互相转换,它的优点是去掉了大量重复的前缀,并且更加易读。
也可以使用application.properties作为配置文件,但不如YAML格式简单。 yml和yaml文件格式是一模一样的,只是文件后缀不同,所以可以合并成一种格式来看。
2. 配置文件优先级
配置文件间的加载优先级 properties(最高)> yml > yaml(最低)。
application.properties > application.yml > application.yaml
- application.properties(properties格式)
server.port=80
spring.main.banner-mode=off
- application.yml(yml格式)
server:
port: 81
logging:
level:
root: debug
- application.yaml(yaml格式)
server:
port: 82
不同配置文件中相同配置按照加载优先级相互覆盖,不同配置文件中不同配置全部保留
3.yaml数据格式
YAML(YAML Ain’t Markup Language),一种数据序列化格式
- 优点:容易阅读、容易与脚本语言交互、以数据为核心,重数据轻格式
常见的文件扩展名有两种:
-
.yml格式(主流)
-
.yaml格式
对于文件自身在书写时,具有严格的语法格式要求,具体如下:
yaml语法规则
key: value -> value 前面一定要有空格**
- 大小写敏感
- 属性层级关系使用多行描述,每行结尾使用冒号结束
- 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)
- 属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)
- #号 表示注释
常见的数据书写格式
boolean: TRUE #TRUE,true,True,FALSE,false,False均可
float: 3.14 #6.8523015e+5 #支持科学计数法
int: 123 #0b1010_0111_0100_1010_1110 #支持二进制、八进制、十六进制
null: ~ #使用~表示null
string: HelloWorld #字符串可以直接书写
string2: "Hello World" #可以使用双引号包裹特殊字符
date: 2018-02-17 #日期必须使用yyyy-MM-dd格式
datetime: 2018-02-17T15:02:31+08:00 #时间和日期之间使用T连接,最后使用+代表时区
表示数组,在属性名书写位置的下方使用减号作为数据开始符号,每行书写一个数据,减号与数据间空格分隔
subject:
- Java
- 前端
- 大数据
enterprise:
name: itcast
age: 16
subject:
- Java
- 前端
- 大数据
likes: [王者荣耀,刺激战场] #数组书写缩略格式
users: #对象数组格式一
- name: Tom
age: 4
- name: Jerry
age: 5
users: #对象数组格式二
-
name: Tom
age: 4
-
name: Jerry
age: 5
users2: [ { name:Tom , age:4 } , { name:Jerry , age:5 } ] #对象数组缩略格式
4.yaml数据读取
4.1读取单一数据
yaml中保存的单个数据,可以使用Spring中的注解直接读取,使用@Value可以读取单个数据,属性名引用方式:${一级属性名.二级属性名……}
记得使用@Value注解时,要将该注入写在某一个指定的Spring管控的bean的属性名上方。现在就可以读取到对应的单一数据行了
4.2读取全部数据
读取单一数据可以解决读取数据的问题,但是如果定义的数据量过大,这么一个一个书写肯定会累死人的,SpringBoot提供了一个对象,能够把所有的数据都封装到这一个对象中,这个对象叫做Environment,使用自动装配注解可以将所有的yaml数据封装到这个对象中
数据封装到了Environment对象中,获取属性时,通过Environment的接口操作进行,具体方法时getProperties(String),参数填写属性名即可
4.3读取对象数据
这个@ConfigurationProperties必须告诉他加载的数据前缀是什么,这样当前前缀下的所有属性就封装到这个对象中。数据属性名要与对象的变量名一一对应。
4.4yaml文件中的数据引用
center:
dataDir: /usr/local/fire/data
tmpDir: /usr/local/fire/tmp
logDir: /usr/local/fire/log
msgDir: /usr/local/fire/msgDir
- 在配置文件中可以使用属性名引用方式引用属性
baseDir: /usr/local/fire
center:
dataDir: ${baseDir}/data
tmpDir: ${baseDir}/tmp
logDir: ${baseDir}/log
msgDir: ${baseDir}/msgDir
- 注意事项,在书写字符串时,如果需要使用转义字符,需要将数据字符串使用双引号包裹起来
lesson: "Spring\tboot\nlesson"
Springboot常用注解
一、启动注解 @SpringBootApplication
等价于使用@Configuration、@EnableAutoConfiguration、@ComponentScan这三个注解,通常用于全局启动类上
@SpringBootApplication
public class PropertyApplication {
public static void main(String[] args) {
SpringApplication.run(PropertyApplication.class, args);
}
}
把@SpringBootApplication换成@Configuration、@EnableAutoConfiguration、@ComponentScan这三个注解,一样可以启动成功,@SpringBootApplication只是将这三个注解进行了简化!
@SpringBootConfiguration 注解,继承@Configuration注解,主要用于加载配置文件
@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类, 并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。
@EnableAutoConfiguration 注解,开启自动配置功能
@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。借助于Spring框架原有的一个工具类:SpringFactoriesLoader的支持,@EnableAutoConfiguration可以智能的自动配置功效才得以大功告成
@ComponentScan 注解,主要用于组件扫描和自动装配
@ComponentScan的功能其实就是自动扫描并加载符合条件的组件或bean定义,最终将这些bean定义加载到容器中。我们可以通过basePackages等属性指定@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现从声明@ComponentScan所在类的package进行扫描,默认情况下是不指定的,所以SpringBoot的启动类最好放在root package下。
二、Controller 相关注解
@Controller
控制器,处理http请求。
@RestController 复合注解
@RestController注解相当于@ResponseBody+@Controller合在一起的作用,RestController使用的效果是将方法返回的对象直接在浏览器上展示成json格式.
@RequestBody
表示请求体的Content-Type必须为application/json格式的数据,接收到数据之后会自动将数据绑定到Java对象上去
@RequestMapping
@RequestMapping 是 Spring Web 应用程序中最常被用到的注解之一。提供路由信息,指定http方法和路径,实现URL到具体请求处理器的映射
@GetMapping用于将HTTP get请求映射到特定处理程序的方法注解
除了@RequestMapping可以指定请求方式之外,还有一些其他的注解,可以用于标注接口路径请求,比如GetMapping用在方法上时,表示只支持get请求方法,等价于@RequestMapping(value=“/get”,method=RequestMethod.GET)
@GetMapping("get")
public ResponseEntity get(){
return new ResponseEntity(HttpStatus.OK);
}
@PostMapping
@PostMapping("post")
public ResponseEntity post(){
return new ResponseEntity(HttpStatus.OK);
}
@PutMapping
用在方法上,表示只支持put方式的请求,通常表示更新某些资源的意思
@PutMapping("put")
public ResponseEntity put(){
return new ResponseEntity(HttpStatus.OK);
}
@DeleteMapping
用在方法上,表示只支持delete方式的请求,通常表示删除某些资源的意思
@DeleteMapping("delete")
public ResponseEntity delete(){
return new ResponseEntity(HttpStatus.OK);
}
三、取请求参数值
@PathVariable:获取url中的数据
@Controller
@RequestMapping("/User")
public class HelloWorldController {
@RequestMapping("/getUser/{uid}")
public String getUser(@PathVariable("uid")Integer id, Model model) {
System.out.println("id:"+id);
return "user";
}
}
@RequestParam:获取请求参数的值
@Controller
@RequestMapping(“/User”)
public class HelloWorldController {
@RequestMapping("/getUser")
public String getUser(@RequestParam("uid")Integer id, Model model) {
System.out.println("id:"+id);
return "user";
}
}
四、注入bean相关
@Repository
DAO层注解,DAO层中接口继承JpaRepository<T,ID extends Serializable>,需要在build.gradle中引入相关jpa的一个jar自动加载。
Repository注解源码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {
/**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any (or empty String otherwise)
*/
@AliasFor(annotation = Component.class)
String value() default "";
}
@Service
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
/**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any (or empty String otherwise)
*/
@AliasFor(annotation = Component.class)
String value() default "";
}
- @Service是@Component注解的一个特例,作用在类上
- @Service注解作用域默认为单例
- 使用注解配置和类路径扫描时,被@Service注解标注的类会被Spring扫描并注册为Bean
- @Service用于标注服务层组件,表示定义一个bean
- @Service使用时没有传参数,Bean名称默认为当前类的类名,首字母小写
- @Service(“serviceBeanId”)或@Service(value=”serviceBeanId”)使用时传参数,使用value作为Bean名字
- @Scope作用域注解
- @Scope作用在类上和方法上,用来配置 spring bean 的作用域,它标识 bean 的作用域
@Scope源码
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Scope {
/**
* Alias for {@link #scopeName}.
* @see #scopeName
*/
@AliasFor("scopeName")
String value() default "";
@AliasFor("value")
String scopeName() default "";
ScopedProxyMode proxyMode() default ScopedProxyMode.DEFAULT;
}
属性介绍
value
singleton 表示该bean是单例的。(默认)
prototype 表示该bean是多例的,即每次使用该bean时都会新建一个对象。
request 在一次http请求中,一个bean对应一个实例。
session 在一个httpSession中,一个bean对应一个实例。
proxyMode
DEFAULT 不使用代理。(默认)
NO 不使用代理,等价于DEFAULT。
INTERFACES 使用基于接口的代理(jdk dynamic proxy)。
TARGET_CLASS 使用基于类的代理(cglib)。
@Entity实体类注解
@Table(name =“数据库表名”),这个注解也注释在实体类上,对应数据库中相应的表。
@Id、@Column注解用于标注实体类中的字段,pk字段标注为@Id,其余@Column。
@Bean产生一个bean的方法
@Bean明确地指示了一种方法,产生一个bean的方法,并且交给Spring容器管理。支持别名@Bean(“xx-name”)
@Autowired 自动导入
@Autowired注解作用在构造函数、方法、方法参数、类字段以及注解上
@Autowired注解可以实现Bean的自动注入
@Component
把普通pojo实例化到spring容器中,相当于配置文件中的
虽然有了@Autowired,但是我们还是要写一堆bean的配置文件,相当麻烦,而@Component就是告诉spring,我是pojo类,把我注册到容器中吧,spring会自动提取相关信息。那么我们就不用写麻烦的xml配置文件了
五、事务注解 @Transactional
在Spring中,事务有两种实现方式,分别是编程式事务管理和声明式事务管理两种方式
- 编程式事务管理: 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
- 声明式事务管理:建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务,通过@Transactional就可以进行事务操作,更快捷而且简单。推荐使用
Springboot部署方式
两种方式
一、jar包部署
jar包方式启动,也就是使用SpringBoot内置的tomcat运行。服务器上面只要你配置了 jdk1.8及以上就ok,不需要外置tomcat。
1、先在pom.xml文件中导入Springboot的maven依赖
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
2、执行package
3、打包完成生成这样的jar包文件,发到服务器上使用java -jar运行就可以了
二、war包部署
传统的部署方式:将项目打成war包,放入tomcat 的webapps目录下面,启动tomcat,即可访问。
1、修改pom.xml配置文件
//<packaging>jar</packaging>
//修改为
<packaging>war</packaging>
2、改造启动类
如果是war包发布,需要增加SpringBootServletInitializer子类,并重写其configure方法,或者将main函数所在的类继承SpringBootServletInitializer子类,并重写configure方法
3、在IDEA中使用mvn clean命令清除旧的包,并使用mvn package生成新的war包
4、使用外部配置的Tomcat启动项目
- 首先下载安装tomcat,在本地配置好
- 在springboot项目中添加配置
<packaging>
元素用于指定项目的打包方式,有以下几种可选值:
- jar:打包成一个 JAR 文件;
- war:打包成一个 WAR 文件,用于部署到 Web 容器中;
- ear:打包成一个 EAR 文件,用于部署到 Java EE 应用服务器中;
- pom:不打包成文件,只用于管理依赖等元数据信息;
- maven-plugin:打包成一个 Maven 插件,用于扩展 Maven 的功能。
拦截器与过滤器的区别与联系
联系
- 都是基于AOP原理的实现
区别
- 原理不同
拦截器基于反射(动态代理实现)
过滤器基于函数回调 - 使用范围不同
过滤器依赖servlet容器(如tomcat),拦截器不依赖与于ervelet容器
拦截器可以访问Controller上下文,而过滤器不能 - 生命周期不同
在Spring容器的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化被调用一次 - 触发时机不同
过滤器Filter是在请求进入容器后,但在进入servlet之前进行预处理,请求结果是在servlet处理完以后。
拦截器Interceptor是在请求进入servlet后,在进入Controllere之前进行预处理的,Controller中渲染了对应的视图之后请求结束 - 拦截的请求范围不同
拦截器只能对Controller请求起作用,而过滤器可以对几乎所有的请求起作用