//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.0http:
//maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.example
myproject
0.0.1-SNAPSHOT
org.springframework.boot
spring-boot-starter-parent
1.4.0.RELEASE
--Additionallinestobeaddedhere...-->
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-maven-plugin
引入spring-boot-maven-plugin插件可以使mvnpackage打出的jar包能直接用java–jar命令运行,
未使用插件:
会提示:
使用了插件:
多了BOOT-INF,主类的class和所有依赖包都在里面。
4.2编写主类java
由于添加web依赖后它会自动去找主类的main方法,找不到会报错,因此需要创建主类:
创建SpringBootSample\src\main\java目录结构
在该目录下创建Example.java
内容:
importorg.springframework.boot.*;
importorg.springframework.boot.autoconfigure.*;
importorg.springframework.stereotype.*;
importorg.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
publicclassExample{
@RequestMapping("/")
Stringhome(){
return"kkk!
";
}
publicstaticvoidmain(String[]args)throwsException{
SpringApplication.run(Example.class,args);
}
}
其中@EnableAutoConfiguration表示该类是主类,从该类main方法启动。
@RestController是@Controller和@ResponseBody的组合写法,表示方法返回的内容直接给客户端,而不是去找模板。
4.3构建运行
有3种方式,一种是利用springboot插件,执行:
mvnspring-boot:
run
它会自动启动tomcat,默认端口是8080
或者mvnpackage打出jar文件,然后执行:
java-jartarget/myproject-0.0.1-SNAPSHOT.jar
第三种方式是在ide里面直接执行主类的main方法。
5、访问应用
http:
//localhost:
8080
使用ide创建:
idea和eclipse中创建maven项目,跟手工方式一样配置即可。
idea向导创建
idea中还提供了直接创建springboot项目的方式,可以通过向导勾选web等springboot的模块:
File-NewProject-SpringInitializr
配置说明
向导创建出来的工程配置跟手工创建的一致:
自动创建的主类:
注意这里创建了一个配置文件,默认是空的。
可以将很多配置放在里面,如启动端口,数据库连接等自定义配置信息。
@EnableAutoConfiguration和@SpringBootApplication说明
@SpringBootApplication等同于@Configuration,@EnableAutoConfiguration,@ComponentScan三个属性的组合。
当访问非主类的Controller时,就需要主类配置@ComponentScan属性才能扫描到,否则扫描不到。
因此主类上通常用@SpringBootApplication,这样就可以扫描到其他类的bean。
修改端口和上下文路径
application.properties中增加配置:
server.port=90
server.context-path=/kkk
访问:
使用yml配置
yml文件配置可以减少properties的配置量,如:
注意:
1、冒号后面必须带一个空格,否则无法识别
2、要注意缩进,因为它通过代码行缩进确定属性归属级别的。
使用@value读取配置
yml配置:
读取:
测试:
配置中引用配置:
用${}引用即可,如:
注入分组配置:
如果配置的属性较多,则使用@value需要对每个属性都写一个变量来接收,很不方便,可以将属性放到一个分组里,然后定义一个实体类来接收参数,使用时只用引用该实体类即可:
这里的prefix跟配置中的对应。
这里使用@ConfigurationProperties注入了company里面的属性。
也可以直接注入到Controller,需要在controller中定义配置的属性不过最好不要这样用。
如:
。
分dev、online环境配置:
如:
java-jar指定环境
不过这种方式切环境需要改代码,可以在java–jar运行参数中指定环境,它会覆盖掉配置中指定的环境。
如:
java-jarkkk-0.0.1-SNAPSHOT.jar--sprin
g.profiles.active=online
使用thymeleaf模板
thymeleaf是spring提供的模板,类似于freemarker、velocity等。
pom.xml加入依赖:
org.springframework.boot
spring-boot-starter-thymeleaf
templates目录下新建index.html
然后使用@Controller即可返回模板。
使用常用的springmvc注解
匹配多个路径
如:
@RequestMapping(value={"list","users"})
publicStringlist(){
return"index";
}
@GetMapping、@PostMapping等的简化写法
@GetMapping("list")相当于@RequestMapping(value="list",method=RequestMethod.GET).
@PostMapping、@PutMapping等同理。
使用springdatajpa
jpa是一套java提出的规范,用于持久化操作,jpa有很多实现,如hibernate、toplink等。
springdatajpa是封装在hibernate、toplink等上面一层的实现,用户通过它来操作hibernate等,可以不关心底层实现。
配置
pom.xml加入依赖:
org.springframework.boot
spring-boot-starter-data-jpa
mysql
mysql-connector-java
application.yml配置:
spring:
datasource:
driver-class-name:
com.mysql.jdbc.Driver
url:
jdbc:
mysql:
//127.0.0.1:
3306/users
username:
root
password:
123456
jpa:
hibernate:
ddl-auto:
update
show-sql:
true
其中ddl-auto:
update表示如果没有表会自动创建表,有表则不动。
create表示则每次都会把原表drop掉重新创建。
create-drop表示每次都重新创建表,应用停下来就把表删除
none表示不执行任何ddl。
validate表示不执行ddl,但会检查实体类和表结构是否一致,不一致就报错。
show-sql:
true表示打印sql语句。
创建实体类Company.java:
importorg.hibernate.annotations.Generated;
importorg.springframework.boot.autoconfigure.domain.EntityScan;
importorg.springframework.boot.context.properties.ConfigurationProperties;
importorg.springframework.stereotype.Component;
importjavax.persistence.Entity;
importjavax.persistence.GeneratedValue;
importjavax.persistence.Id;
/**
*CreatedbyAdministratoron2017/12/7.
*/
@Entity
publicclassCompany{
@Id
@GeneratedValue
privateLongid;
privateStringname;
privateStringaddress;
publicLonggetId(){
returnid;
}
publicvoidsetId(Longid){
this.id=id;
}
publicStringgetAddress(){
returnaddress;
}
publicvoidsetAddress(Stringaddress){
this.address=address;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
}
其中@Id表示主键,@GeneratedValue表示自动生成
执行程序即可自动创建表
Long映射成了bigint(20)
String映射成了varchar(255)
增删改查操作:
查询全部数据
新增数据
查询单条数据
更新
更新也是调用save,发现有id就自动执行update语句
删除
根据条件查询
接口里增加的这个方面名字是约定,它会自动根据name去查询。
开启事务
需要开启事务的方法上增加@Transactional注解即可。
表单验证
1、实体类上用注解加条件:
2、方法参数上用@Valid指定验证的实体,后面紧接一个BindingResult参数获取验证结果。
@RequestMapping("addCompany")
publicCompanyaddCompany(@ValidCompanycompany,BindingResultbindingResult){
if(bindingResult.hasErrors()){
System.out.println(bindingResult.getFieldError().getDefaultMessage());
returnnull;
}
returncompanyRepository.save(company);
}
这里如果不返回null,则执行到companyRepository.save(company);时会抛出异常,jpa会验证实体类的属性。
异常处理
可以异常进行统一处理
定义异常处理类:
MyExceptionHandler.java:
packagecom.example.demo;
importorg.springframework.web.bind.annotation.ControllerAdvice;
importorg.springframework.web.bind.annotation.ExceptionHandler;
importorg.springframework.web.bind.annotation.ResponseBody;
/**
*CreatedbyAdministratoron2017/12/15.
*/
@ControllerAdvice
publicclassMyExceptionHandler{
@ExceptionHandler(value=Exception.class)
@ResponseBody
publicStringkkk(){
return"errorhappend";
}
}
它会自动捕捉异常调用方法。
一般会自定义异常类型,调用不同方法,这里使用Exception异常类只是为了做示范。
自定义异常类通常会增加code属性,抛异常时传入code,外面可以取得code。
通常使用方法:
ResultEnum.java
publicenumResultEnum{
ERROR(-1,"未知错误"),
SUCCESS(0,"成功");
privateIntegercode;
privateStringmsg;
ResultEnum(intcode,Stringmsg){
this.code=code;
this.msg=msg;
}
publicIntegergetCode(){
returncode;
}
publicStringgetMsg(){
returnmsg;
}
}
MyException.java
publicclassMyExceptionextendsRuntimeException{
privateIntegercode;
publicMyException(ResultEnumresultEnum){
super(resultEnum.getMsg());
this.code=resultEnum.getCode();
}
publicIntegergetCode(){
returncode;
}
publicvoidsetCode(Integercode){
this.code=code;
}
}
抛异常
thrownewMyException(ResultEnum.ERROR);
MyExceptionHandler.java
importorg.springframework.web.bind.annotation.ControllerAdvice;
importorg.springframework.web.bind.annotation.ExceptionHandler;
importorg.springframework.web.bind.annotation.ResponseBody;
/**
*CreatedbyAdministratoron2017/12/15.
*/
@ControllerAdvice
publicclassMyExceptionHandler{
@ExceptionHandler(value=MyException.class)
@ResponseBody
publicStringkkk(MyExceptione){
returne.getMessage();
}
@ExceptionHandler(value=RuntimeException.class)
@ResponseBody
publicStringkkkkkk(RuntimeExceptione){
return"runtimeexception";
}
}
注意这里的MyException继承了RuntimeException,它会自动判断抛出异常的类型,找到最精确的匹配,如抛出MyException,则会调用kkk方法。
使用AOP
1、加入aop依赖
org.springframework.boot
spring-boot-starter-aop
2、编写切面类:
如:
packagecom.example.demo;
importorg.aspectj.lang.annotation.Aspect;
importorg.aspectj.lang.annotation.Before;
importorg.springframework.stereotype.Component;
/**
*CreatedbyAdministratoron2017/12/14.
*/
@Aspect
@Component
publicclassCompanyAspect{
@Before("execution(public*com.example.demo.CompanyController.list(..))")
publicvoidbeforeList(){
System.out.println("aspect--beforelist");
}
}
3、测试:
springaop各种注解的详细用法参见”springaop.docx”
主类的位置和spring扫描包路径
默认的spring扫描包路径是从主类开始一层层往下扫描,也可以在主类上用注解设置,如:
@ComponentScan(basePackages={"com.example"})
如果类没有在扫描包路径下,则即使加了@