Spring Boot是全新的框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域成为领导者。
原来使用的Spring开发一般都会集成SpringMvc、myBatis、redis等一些框架,每个框架都有每个框架的标准(比如SpringMvc的前缀和后缀配置),几乎这些标准的实现都是在xml中配置,也就导致resources目录下一大堆的配置文件,有人就在Spring社区吐槽说你们的xml太多太恶心了,而且配置错了IDE也无法检查,只能启动了才能检查的出来。后来有人提出尝试用注解的方式来替代xml,并发现可行,于是就诞生了SpringBoot的前身,后来也就演变成SpringBoot
也就是说SpringBoot旨在减少xml配置(并非完全消灭),秉承开箱即用的原则就像初学java的时候写的main方法输出HelloWorld一样,你只需要编写main方法,接着打印一句话就可以了; 那么他真的有这么神奇吗?
如果你的idea新建项目中没有
在Settings-->plugins-->搜索spring assistant 如果有就勾选,没有就点击
Search in repositories 在仓库中查找
点击安装,重启Idea 到此SpringBoot插件就安装完了。
点击新建项目
点击next 这个界面就是maven项目的配置,填写你的Group 和 Artifact
点击next 勾选上web模块
点击next --> next --> finish 这时候你已经完成了SpringBoot项目的创建
SpringBoot会帮我们自动下载很多依赖,需要稍微等一下 创建好之后会看到这样一个目录
然后我们新建一个controller
然后 启动DemoApplication中的main方法 (右键直接run)
访问localhost:8080/hello 注意不要加项目名称
不需要任何xml,也不需要配置tomcat,直接就可以运行 一个字 爽
查看SpringBoot中的pom.xml文件会发现有parent标签和一个没有写version的依赖
在这篇文章中有详细介绍 https://blog.csdn.net/qq_39205291/article/details/88634077
接着查看SpringBoot启动类上面的@SpringBootApplication标签
点进去这个注解会发现 @SpringBootApplication 由@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan三个注解构成
@SpringBootConfiguration 本质就是一个@Configuration表示这本身就是一个配置类,是Spring容器的主配置类
@EnableAutoConfiguration 自动加载配置类,使用该标签可以把符合条件的@Configuration配置类自动加载到应用中
@ComponentScan 自动扫描包注解,默认扫描该包及其子包,所以把启动类放在最外层就不需要写包的扫描范围了
SpringBoot打包
SpringBoot运行只需要打包成一个jar包 然后使用 java -jar xxx.jar 的命令来运行
使用 maven project 中的package命令打包
然后会在target目录下出现两个jar文件 运行第一个jar文件,访问项目测试
如果报错
检查项目是否有SpringBoot的maven插件
参数设置
既然是main方法启动,且main方法有个args[]的参数,那么我们使用以前的方法来给SpringBoot传参也是可行的;
SpringBoot会把传入的参数封装到ApplicationArguments对象中,这时Spring上下文中的对象,所以可以直接用 @Autowired注解来注入,然后用applicationArguments.getNonOptionArgs()来获取我们所传入的参数
那该怎么给args[] 设置参数值呢,首先可以用idea的 program arguments
如果打包成jar包来运行的话,可以用
运行命令后面加个 ‘空格’ 然后写上参数,也是可以获取的到的。这样设置两套环境,或者输入数据库用户名密码等,都很方便
端口设置
application.properties文件中加上 server.port=8081 就可以将项目启动端口设置为8081
server.context-path=/demo 将项目上下文路径设置为demo
重启项目后访问http://localhost:8081/demo/hello
https://blog.csdn.net/weixin_41997172/article/details/80537992 这里有application.properties所有的配置详细介绍
SpringBoot默认读取application.properties作为配置文件
默认情况下读取classpath:application.properties、classpath:config/application.properties、
项目根目录/application.properties、项目根目录/config/application.properties 这四个路径的配置文件
优先级为 项目根目录/config/application.properties > 项目根目录/application.properties > classpath:config/application.properties > classpath:application.properties
Banner设置
在resources目录下添加banner.txt文件,形状随意 就可以把启动时的默认图像替换掉
改为
参数属性注入
在使用SSM框架时,我们往类中的属性注入值时使用@Value("${}")来注入
但往往忽略了,其实Spring默认帮我们加载了属性注入器PropertySourcesPlaceholderConfigurer
并且在applicationContext.xml中加载了app.properties文件 所以才能使用@Value("${}")来注入值
那么在SpringBoot中同样需要这样的参数绑定
首先在application.properties中添加属性 、 然后在绑定类中贴上 @ConfigurationProperties(prefix = "db") 前缀名根据自己定义
但如果使用的是DruidDataSource,无法在类上贴注解值 可以在返回Bean的方法上贴上该注解
同样可以完成注入属性的功能
application.properties中的属性也可以使用命令行方式注入
先把application.properties中的db.属性全部注释掉
然后使用maven package 打包一个jar包
运行 访问
使用参数绑定方式运行
再次访问
热部署插件
SpringBoot本身没有热部署的功能,在启动之后修改代码重新编译并不会马上生效,需要重启项目
首先在项目pom.xml中添加
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
然后再次修改代码,点击编译。会出现重启的状态,但是会很快,这就是SpringBoot的热部署
再次访问就是修改之后的效果。 修改完一定要先编译才有效果
其实就是重启项目,但是把不变的类一直放在内存中,只是把改变过的类重新加载了一次
static和template目录下的编译是不会触发重启的 (修改静态资源也要编译才会生效)
spring.devtools.restart.additional-exclude=public/**,views/** 编译重启检查 会排除这些目录
spring.devtools.restart.trigger-file=trigger.file 指定文件修改后才会触发重启 也基本上就是手动重启
配置 指定文件修改后才会触发重启后,每次编译不会触发重启,只有当trigger.file这个文件被修改且编译的时候才会触发重启
集成MyBatis
------------------------------------------------------------集成druidDataSource-------------------------------------------------------
SpringBoot提供了很多工具包
名字大多为 spring-boot-starter-* 这些是springBoot自带的starter 也就是springBoot提供的支持
还有一些名字为 *-spring-boot-starter 这些是第三方工具自己整合的springBoot的starter 如 druid-spring-boot-starter
这些jar包一般包含了jar包本身的原始依赖 druid.jar 还有一个自动装配的依赖
自动装配的依赖
以前我们Spring集成Druid的时候用DruidDataSource会在xml中配置一个
<bean id="com.alibaba.druid.DruidDataSource">
中间配置数据库连接属性
</bean>
现在就不需要配置这个xml了,因为springBoot会自动装配这个依赖,我们只需要按照SpringBoot提供的标准,在application.properties中配置连接池属性就可以了
首先导入jar包 连接池的包 驱动包 和 spring jdbc的包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
然后在application.properties中配置连接池属性
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
创建测试类,访问
然后再增加一个属性
spring.datasource.druid.initial-size=5
再次访问
更多的druidDataSource参数 参考 https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter
-----------------------------------------------------------------集成MyBatis------------------------------------------------------------
上面已经把dataSource集成到了SpringBoot项目中,如果集成MyBatis的话还需要再
配置一个sqlSessionFactory(设置mybatis的全局配置文件路径、配置别名扫描包的路径、管理映射文件)、
扫描Mapper接口位置、配置事务等; sqlSessionFactory是springBoot默认帮我们创建出来的 不需要去管
首先在pom.xml中加入mybatis集成springBoot的依赖包
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
设置mybatis的全局配置文件路径: (非必须配置不需要全局setting就可以不用)
直接在application.properties文件中加入mybatis.config-location=classpath:mybatis-config.xml
配置别名扫描包的路径: (非必须配置不需要使用别名就可以不用)
mybatis.type-aliases-package=com.xiaoww.mybatis.mapper
管理映射文件(mapper.xml):(非必须配置Mapper.xml和Mapper同名同包就可以不用)
mybatis.mapper-locations=classpath:com/xiaoww/mybatis/mapper
扫描Mapper接口位置:
成springBoot的依赖包 在springBoot启动类中加上@MapperScan("com.xiaoww.mybatis.mapper")
需要注意Mapper接口位置只能扫描mapper包而不能扫描mapper的上级包,因为@MapperScan注解扫描到的所有接口都会使用动态代理创建类,那么也会给service创建导致在spring容器中的service都会有两个Bean,启动就会报错注入XxxService失败
配置打印sql:
application.properties文件logging.level.com.xiaoww.mybatis.mapper=debug设置某个包的特定日志级别
SpringBoot集成事务
集成完mybatis做了查询操作之后,就要开始做增删改操作,那么就得提到事务
先写个save方法来测试一下,然后故意在service中抛出一个错误
同样的保存到了数据库中
说明SpringBoot默认是没有事务的
在service上贴上注解@Transactional开启事务,在springBoot启动类中贴上@EnableTransactionManagement 扫描第三方注解,就可以开启SpringBoot中的事务,再次测试,数据没有保存。
SpringBoot会自动加载@EnableTransactionManagement注解,所以@EnableTransactionManagement可以省略
自动装配原理
相比XML配置来说 SpringBoot的方式让我们省去了在xml中配置各种Bean的繁琐,但是这些Bean始终是在使用之前创建出来的,那么SpringBoot是如何创建这些Bean的,根据什么方式呢;
首先读取所有jar包和项目中的spring.factories文件 该文件中标明了,启动哪个类来进行自动装配
然后Spring会加载这些类,而在这些类会贴上@Configuration标签标明是配置类 而且会有一个或多个@Bean标签装载Bean
静态资源
classpath下的static是SpringBoot的默认静态资源文件放置路径,也就是说相当于webapp一样,直接可以访问的
除了static之外,public、resources、MATE-INF/resources都可以作为静态资源路径;
SpringBoot默认只认这几个路径,如果需要再加上多个路径就在application.properties中配置
spring.resources.static-locations = classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,classpath:/mydir/
集成FreeMarker
由于SpringBoot对jsp支持并不好,所以动态页面模板一般会使用其他的模板,而FreeMarker就是个比较好的选择
首先导入依赖jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
编写请求
在 classpath:templates目录下新建 freeMarker.ftl
<h1>Hello : ${name}</h1>
就可以访问了,SpringBoot默认会设置前缀(也就是MVC中配置的/WEB-INF/views)后缀名(也就是MVC中配置的.jsp)
freeMarker默认是不能在页面中取session中的数据
在application.properties中加上
spring.freemarker.expose-session-attributes=true 这行属性就可以取session中的数据了
错误处理页面
直接在classpath:public/error目录中定义相应的错误页面就可以了
可以使用5xx.html来匹配所有500、501、502等错误
servlet组件
要启用servlet组件只需要在SpringBoot启动类上贴@ServletComponentScan标签就可以自动扫描该包及其子包下的servlet
文件上传
spring.http.multipart.enabled=true 是否允许文件上传 spring.http.multipart.max-file-size=1MB 上传单个文件最大的size spring.http.multipart.max-request-size=10MB 单次请求的最大size
跟SpringMvc上传一模一样,但是SpringBoot一般是打包成jar包运行,所以也不存在webapp目录,那么就必须指定上传图片的盘符而不能使用servletRequest.getContextPath()获取项目根路径下的某个文件夹
拦截器
让SpringBoot启动类去继承WebMvcConfigurerAdapter重写addInterceptors方法
使用InterceptorRegistry去注册一个拦截器对象,并设置拦截路径信息就可以了。
也可以另外新建一个类来存放拦截器注册器