springboot核心知识学习笔记
springboot 是一个服务于spring应用的框架。 它可以快速的启动 一个Spring 应用,只需要“run”就能创建一个独立的、生产级别的Spring应用。
本文主要是了解springboot自动配置实现和一些拓展应用。在此之前,必须理解一些 Spring 框架的基础知识。
通过Hello World来认识spring boot
- 按照原来的实现。 如使用spring MVC 框架,实现json 数据的输出,需要经过大量的配置,尤其是编写XML文件,可以说是相当的繁琐:
- 通过IDEA新建Spring MVC项目
- 设置运行、调试相关配置
- 导入Spring MVC 相关类库
- 添加 Controller
- 修改 web.xml
- 配置 component-scan,ViewResolver((dispatcher-servlet.xml)
- 添加视图文件(.jsp)
- 通过 Model 向 View 传值
- Spring-Boot的实现
在Pom文件中导入starter依赖,不需要我们任何配置(它具有嵌入式web服务器,自动化配置Spring功能),直接编写Controller类即可,最后通过main函数启动。简而言之,它消除了设置以往应用程序所需的复杂例行配置,尽可能最快的开发应用。
- springboot的特点:
Spring Boot是伴随着Spring 4.0而生的,因而继承了Spring优秀的基因,包括:
- 开箱即用。提供了非常多以spring-boot-starter-开头的开箱即用的工具包,但通过自己设置参数,即可快速摆脱这种方式。
- 没有代码生成,无需 繁琐的XML 配置
- start自动依赖与版本控制,省去了版本冲突带来的许多头疼问题
- Springboot应用的热部署
- 提供了一些大型项目中常见的非功能性特性,如内嵌Servlet容器、安全、指标,健康检测、外部化配置等
SpringBootApplication 的核心注解
通过上面简短的回顾,我们看到springboot非常快的“ run”就可以启动应用,它整个启动流程都封装在SpringApplication.run方法中,但本质上就是在Spring容器启动的基础上做了大量的扩展,而在此处的关键则是SpringBootApplication注解,利用条件配置来实现自动配置和启用组件扫描,查看该注解详情,如下图示内容:
SpringBootApplication 本质上是由 3 个注解组成,分别是
- @SpringBootConfiguration
就是 @Configuration,它是Spring框架的注解,标明该类是一个 JavaConfig配置类。SpringBoot定义了很多有趣的条件,并把他们运用到了配置类上,这些配置类构成了 SpringBoot的自动配置的基础。 - @EnableAutoConfiguration
注解表示开启Spring Boot自动配置功能,Spring Boot会根据应用的依赖、自定义的bean、classpath下有没有某个类 等等因素来猜测你需要的bean,然后注册到IOC容器中,即在相应的Properties类上不用加 @Component注解 - @ComponentScan
注解对应XML配置形式中的 context:component-scan元素,表示启用组件扫描,Spring会自动扫描所有通过注解配置的bean,然后将其注册到IOC容器中。我们可以通过 basePackages等属性来指定 @ComponentScan自动扫描的范围,如果不指定,默认从声明 @ComponentScan所在类的 package进行扫描。正因为如此,SpringBoot的启动类都默认在 src/main/java下。
一些文章中有更为详尽的介绍,我这里介绍一篇。
https://blog.csdn.net/f5465245/article/details/109077270?biz_id=102&utm_term=spring%20boot%20%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-2-109077270&spm=1018.2118.3001.4187
Springboot 部署
一般来说,要么全部打包成一个jar,或者打包成一个war。
- 第一种方法(idea)
- clean
- package
- 第二种方法(命令行):
-例如项目文件在c盘,切换盘符。 cd C:\Users\xxx\springboot
-要先配好 maven 环境变量 ,然后mvn install,出现 BUILD SUCCESS 证明打包成功,发现 自动生成了 target 目录, jar 包就在目录里边;
-接着输入命令: java -jar target/springboot-0.0.1-SNAPSHOT.jar
就启动这个jar了,通过这种方式,把此jar上传到服务器并运行,就可达到部署的效果。
Springboot 配置切换和 yml
- 在springboot里还是要用到配置文件的。 除了使用.properties外,springboot还支持 yml格式。yml格式的可读性和…properties比起来差不多,只是更简洁,但是有时候还没有不如properties 看起来那么规整。
如图所示,左边是application.properties的写法,右边是application.yml的写法,他们达到的效果是相同的。
- 在application.yml 文件书写注意:
- 不同“等级” 用冒号隔开
- 次等级的前面是空格,不能使用制表符(tab)
- 冒号之后如果有值,那么冒号和值之间至少有一个空格,不能紧贴着
- 有时候在本地测试是使用8080端口,可是上线使用的又是80端口。 此时就可以通过多配置文件实现多配置支持与灵活切换。 通常有3个配置文件:
- 核心配置文件:application.properties
- 开发环境用的配置文件:application-dev.properties
- 生产环境用的配置文件:application-pro.properties
这样就可以通过application.properties里的spring.profiles.active 灵活地来切换使用哪个环境了,不仅可以通过修改application.properties文件进行切换,还可以在部署环境下,指定不同的参数来确保生产环境总是使用的希望的那套配置。
Springboot 持久层支持
springboot框架集成许多优秀的底层支持,这里就简单介绍一下JPA和mybatis 情况下所必要的配置,不介绍更详细的使用步骤了。
- JPA(Java Persistence API)是Sun官方提出的Java持久化规范,用来方便大家操作数据库。真正干活的可能是Hibernate,TopLink等等实现了JPA规范的不同厂商,默认是Hibernate。
- 配置文件application.properties,添加jpa
- 在pom.xml中添加jpa依赖
- 创建实体类
@Entity 注解表示这是个实体类Category
@Table(name = “category_”) 表示这个类对应的表名是 category_ ,注意有下划线哦
@Id 表明主键
@GeneratedValue(strategy = GenerationType.IDENTITY) 表明自增长方式
@Column(name = “id”) 表明对应的数据库字段名 - 创建dao接口
继承JpaRepository,并且提供泛型<Category,Integer> 表示这个是针对Category类的DAO,Integer表示主键是Integer类型。
JpaRepository 这个父接口,就提供了CRUD, 分页等等一系列的查询,直接拿来用。 - 然后创建CategoryController 类。接受listCategory映射, 然后获取所有的分类数据,传递给前端。
- mybatis注解方式
- 添加配置文件application.properties,添加数据库信息。
- 在pom.xml中添加mybatis依赖
- 同样创建实体类Category。
- 增加一个包.mapper,创建接口CategoryMapper。
使用注解@Mapper 表示这是一个Mybatis Mapper接口。
使用@Select注解表示调用findAll方法会去执行对应的sql语句。 - 然后创建Controller 类,开始开发。
Springboot CRUD和分页
这里就介绍一下Mybatis CRUD和分页,还有Springboot JPA 的方式就不详细展开。
使用Mybatis 里讲解的PageHelper插件。
- 注解@Configuration 表示PageHelperConfig 这个类是用来做配置的。
- 注解@Bean 表示启动PageHelper这个拦截器。
- 新增加一个包 然后添加一个类PageHelperConfig ,其中进行PageHelper相关配置。
- offsetAsPageNum:设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用
p.setProperty("offsetAsPageNum", "true");
- rowBoundsWithCount:设置为true时,使用RowBounds分页会进行count查询.
p.setProperty("rowBoundsWithCount", "true");
- reasonable:启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页。
p.setProperty("reasonable", "true");
- 修改CategoryMapper,增加CRUD方法的支持。 其实就是调用不同的SQL语句。
- 修改查询映射,这里有个例子
@RequestMapping("/listCategory")
public String listCategory(Model m,@RequestParam(value = "start", defaultValue = "0") int start,@RequestParam(value = "size", defaultValue = "5") int size) throws Exception {
PageHelper.startPage(start,size,"id desc");
List<Category> cs=categoryMapper.findAll();
PageInfo<Category> page = new PageInfo<>(cs);
m.addAttribute("page", page);
return "listCategory";
}
- 在参数里接受当前是第几页 start ,以及每页显示多少条数据 size。 默认值分别是0和5。
@RequestParam(value = “start”, defaultValue = “0”) int start,@RequestParam(value = “size”, defaultValue = “5” - 根据start,size进行分页,并且设置id 倒排序
PageHelper.startPage(start,size,“id desc”); - 因为PageHelper的作用,这里就会返回当前分页的集合了
List cs=categoryMapper.findAll(); - 根据返回的集合,创建PageInfo对象
PageInfo page = new PageInfo<>(cs); - 把PageInfo对象扔进model,以供后续显示
m.addAttribute(“page”, page); - 跳转到页面 return “listCategory”;