Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。
springboot项目
1.pom文件
springboot项目最核心的是其maven工程中的pom文件的编写,我们有多种方式可以在maven中构建一个springboot项目。
springboot项目中的pom文件,按照官方要求,一般需要在基本的pom配置中添加额外几个地方:
- 继承Springboot提供的一个父项目。
springboot官方推荐我们使用spring-boot-starter-parent,在spring-boot-starter-parent中包含了以下
信息:
Java版本
项目编码
测试框架
资源过滤
插件配置
。。。
也可以自己在pom中覆盖这些默认值:
- 根据需求添加对应启动器starter的依赖。
springboot的启动器 starter主要用来简化依赖用的,例如原来在maven项目中需要使用web相关的功能和框架,那么就要引入对应的一些web相关的依赖,并且需要自己去找这些依赖的坐标和版本,但是springboot中只需要引入一个starter就行了:spring-boot-starter-web。当然,如果更换starter中默认的依赖,也是可以的。例如,spring-boot-starter-web中默认使用的是内嵌的tomcat服务器,可以替换为jetty服务器,具体如下: 先排除不用的默认依赖,在手动添加自己需要的依赖。
- 配置springboot的maven插件。
springboot的Maven插件(Spring Boot Maven plugin)能够以Maven的方式为应用提供springboot的支持,即为Spring Boot应用提供了执行Maven操作的可能。该插件能够将Spring Boot应用打包为可执行的jar或war文件,然后以普通的jar包方式运行springboot应用。
2.程序入口
springboot项目中需要一个程序入口,就是一个类中含有main方法,但是需要在这个类上使用springboot的专用注解@SpringBootApplication
该注解可以让当前类成为一个配置类,自动扫描用户的包,以及最重要的一个功能:开启springboot的自动配置功能:
3.测试代码
springboot项目中的测试类,默认使用了spring-test模块以及结合了junit测试框架。
这个测试类和springboot项目的入口类的位置的关系,运行测试类的时候,会自动先运行入口类,
因为要先读取配置、扫描包、开启自动配置功能等。入口类也是一个配置类。
一般会在同包以及子包下自动查找要使用的类。当前例子中,测试类和入口的类的位置就是在同一个包下面。
如果测试类和入口类(配置类)的位置比较复杂或者混合,也可以自己去明确指定,
配置文件
在springboot项目中,默认只有一个配置文件,在大多数情况下这个一个配置文件也就足够了。
springboot的配置文件,默认支持俩种方式:
- properties文件
application.properties :
- yml文件
application.yml :
俩种文件的配置内容一致,但是配置的格式不同。俩个文件同时存在,优先使用properties文件中
的配置。
pom文件中添加web启动器的依赖:
运行springboot的程序入口类DemoApplication。
自动配置:
javaconfig
spring中Bean的配置方式 :
- Xml配置方式
2 .Annotation配置方式 - JavaConfig配置方式
类要配置到spring容器中时,如果是xml方式的话,就是在xml中配置bean标签即可,如果是annotation方式的话,在类上面加入@Component注解即可,如果是JavaConfig方式的话,编写一个java的配置类即可。
JavaConfig类:
该配置类放到springboot入口类的包下或者其子包下,会被自动扫描读取到,其本质上和xml配置以及annotation配置的原理是一样的,只是变了另一种形式。
2.autoconfig
springboot中的自动配置 :
当前我们在springboot项目中引入一个框架的时候,例如springmvc框架,我们不几乎不需要做任何配置,就可以使用到springmvc中的功能并且成功运行,这就是因为引入springmvc框架后,springboot就已经自动帮我们把这个框架都默认配置好了。
如何实现的自动配置:
整体思路是这样的,常用框架对应的JavaConfig类都已经编写好了,springboot启动的时候会一个一个的进行读取,但是读取的时候会先根据条件进行判断,看是否需要真的读取该配置类去配置对应的框架。
所以,关键的一点在于,每个配置类中,都可以添加条件注解,来判断是否满足某一个条件,从而决定是否读取该配置类。
具体流程如下 :
程序入口类上使用 @SpringBootApplication 注解
@SpringBootApplication 注解又包含了 @EnableAutoConfiguration 注解
@EnableAutoConfiguration 注解又导入(@Import)了 AutoConfigurationImportSelector
类
AutoConfigurationImportSelector 中,定义了一个方法 getCandidateConfigurations
getCandidateConfigurations方法可以扫描spring.factories文件中的配置
spring.factories文件在
spring-boot-autoconfigure-2.3.0.RELEASE.jar的META-INF中
spring.factories文件中声明了很多java配置类,但是每个配置类都是需要满足一定的条件才会执行
(例如: @ConditionalOnClass 、 @ConditionalOnProperty 、
@ConditionalOnMissingBean 等
web
1.springmvc
在springboot中使用springmvc非常简单,只需要引入一个starter即可:
在不考虑视图层的数据展现问题的情况下,后端可以创建出RSETFul风格的接口,供前端进行调用访问。
REST(Representational State Transfer),是2000年Roy Fielding博士在他的博士论文中所提出的一种软件架构模式。
REST就是一种设计API的模式。最常用的数据格式是JSON。由于JSON能直接被JavaScript读取,所以,
以JSON格式编写的REST风格的API具有简单、易读、易用的特点。
Rest架构的主要原则
- 系统中所有事物都被抽象为资源
- 每个资源有唯一的资源标识符
- 同一个资源具有多种表现形式(xml,json等)
- 对资源的各种操作不会改变资源标识符
- 所有的操作都是无状态的
- 符合REST原则的架构方式即可称为RESTful
如果要修改项目的端口后和项目的根路径,可以在application.properties进行配置,把其默认值给覆盖
了:
mybatis
springboot中使用mybatis框架,主要是要引入其对应的starter: mybatis-spring-boot-starter,通过名字可用看出(springboot提供的starter都是spring-boot-starter-xxx),这个starter其实是mybatis自己进行的实现,并提供了结合在springboot中的解决方案。
使用了该Starter之后,只需要定义一个DataSource即可,它会自动创建使用该DataSource的SqlSessionFactoryBean以及SqlSessionTemplate。会自动扫描你的Mappers,并关联到SqlSessionTemplate,然后注册到Spring上下文中,最终就可以使用@Autowired注解把映射接口的实现类注入到指定地方了。
1.xml
pom.xml ,主要是引入了mybatis-spring-boot-starter
springboot启动类: Application添加的关键的注解: @MapperScan
注意1,springboot程序入口中使用了@MapperScan({“com.briup.mapper”})注解
该注解会扫描指定包下的mybatis映射接口,并且为其自动生成实现对象。
注意2,application.properties中已经配置了读取mybatis的配置文件和映射文件的路径,同时也配置mybatis下的别名。
注意3,也可以不使用@MapperScan,但是需要在每一个映射接口上添加注解@Mapperspringboot也会自动扫描到并识别的。
2.annotation
mybaits中使用annotation来映射sql语句,例如:springboot-mybatis-annotation项目。
springdata-jpa
1.简介
Spring Data 项目的目的是为了简化构建基于 Spring 框架应用的数据访问,包括关系型数据库库、非关系型数据库、Map-Reduce 框架、云数据服务等。Spring Data JPA是Spring Data下面的一个子项目,其提供了对JPA的操作支持。
JPA(Java Persistence API)是当年的Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据。
它的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate,TopLink,JDO等
ORM框架各自为营的局面。值得注意的是,JPA是在现有Hibernate,TopLink,JDO等ORM框架的基础上发展而来的。JPA在JAVA EE 5的时候也加入了其规范之中。
Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,使用 Spring DataJPA 可以极大提高开发效率!
Spring Data JPA让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来实现。
2.使用
springboot中使用Spring Data JPA,需要引入其对应的starter,maven会自动引入JPA及其相应的实现,
它默认采用的是hibernate的实现,通过几步简单的操作,就可以使用spring-data-jpa框架了
Spring Data JPA中采用泛型接口的形式,预先定义好了一些基本的CURD的方法。泛型中需要提供操作的实体类型以及对应的主键类型。
在使用的时候,只需要自定义dao层接口,然后继承JpaRepository接口,并指定接口中泛型的类型。
dao层接口 UserDao
实体类 User
@Entity 表示当前类是JPA中的一个实体类
@Table(name=“t_user”) 表示当前实体类对应数据库中的表为 t_user
@Id 表示当前属性对应t_user表中的主键列
@GeneratedValue 表示该属性对应的t_user表中列值是自动增长的
@Column(nullable=false,unique=true) 表示当前属性对应t_user表中的列值是非空唯一的
@Enumerated(EnumType.STRING) 表示当前属性对应枚举类型的String形式,而不是原始编号
3.查询
Spring Data JPA中提供了强大的查询功能,我们只需要在dao层接口中按规则,定出对应的查询方法,那么Spring Data JPA会根据我们所定义的 方法名 ,自动生成对应的sql语句,例如:
4.排序
Spring Data JPA中可以使用 Sort 对查询的结果进行排序,让 Sort 作为查询方法的参数即可。
父接口中已经有定好的方法的参数含有 Sort ,例如 JpaRepository 中的 List findAll(Sortsort);
也可以自己在接口中自定义方法的参数中添加 Sort 参数:
5.分页
Spring Data JPA中分页功能和排序的使用方式类似,只需要在查询方法的参数列表中添加一个Pageable 类型的参数即可。
父接口中已经有定好的方法的参数含有 Pageable ,例如 PagingAndSortingRepository 中的Page findAll(Pageable pageable);
也可以自己在接口中自定义方法的参数中添加 Pageable 参数:
方法的返回类型是可以是Page类型的,也可以是List集合类型的,只是Page类型的返回值可以提供更多的分页相关信息的获取。
6.注解
Spring Data JPA中可以在接口中自定义方法上面使用 @Query 注解,在该注解中可以使用JPQL或SQL来指定此方法被调用的时候需要执行的sql语言是什么。
@Query 注解还可以支持更新和删除的语句,但是需要结合 @Modifying 注解,以及事务管理的注解@Transactional
7.关联
Spring Data JPA中除了单表操作外,还可以支持多表级联操作,但是这需要表和表之间有关联关系,同时还需要在实体类中把这种关联关系给配置映射出来(Object-Relationl Mapping)。
1对1关系:
假设一个学生对应一个地址,一个地址也对应一个学生,那么学生和地址之间就是1 对1关系。
级联查询
1对N关系:
N对N关系:
级联查询:
8.自定义
在实际的业务功能中,可能有一些查询的返回结果和当前任何一个实体类都不对应,例如一个查询是从
几张不同的表中分别挑选出来了几个字段来作为结果,那么这个查询结果就和当前任何一个实体类都不
对应。