什么是SpringBoot
Spring Boot 是所有基于 Spring 开发的项目的起点。Spring Boot 的设计是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的配置文件。
什么是 Spring Boot
- 它使用 “习惯优于配置” (项目中存在大量的配置,此外还内置一个习惯性的配置,让你无须)的理念让你的项目快速运行起来。
- 它并不是什么新的框架,而是默认配置了很多框架的使用方式,就像 Maven 整合了所有的 jar 包一样,Spring Boot 整合了所有框架。
默认生成的项目结构:
- SpringbootApplication: 一个带有 main() 方法的类,用于启动应用程序
- SpringbootApplicationTests:一个空的 Junit 测试了,它加载了一个使用 Spring Boot 字典配置功能的 Spring 应用程序上下文
- application.properties:一个空的 properties 文件,可以根据需要添加配置属性
- pom.xml: Maven 构建说明文件
SpringBoot 启动类配置
Spring Boot 项目通常有一个名为 *Application 的入口类,入口类里有一个 main 方法,这个 main 方法其实就是一个标准的 Java 应用的入口方法。在应用当中,这个包含main方法的启动类需要放在项目的根目录,启动类自身是一个基于注解的配置类,@SpringBootApplication 是 Spring Boot 的核心注解,它是一个组合注解,该注解组合了: @Configuration、@EnableAutoConfiguration、@ComponentScan 若不使用 @SpringBootApplication 注解也可以使用这三个注解代替。
@ComponentScan:扫描当前包及其子包下被@Component,@Controller,@Service,@Repository注解标记的类并纳入到spring容器中进行管理。该注解有个特性:如果不指定需要扫描的包或者需要注册的类,则默认是扫描该使用@ComponentScan注解的类所在的包以及子包,所以将使用了@SpringBootApplication注解的包含main方法的启动类放在项目根目录,则会扫描项目的所有包。
@EnableAutoConfiguration:启用自动配置,该注解会使SpringBoot根据项目依赖的jar包自动配置项目的配置项。例如:我们添加了Spring-boot-starter-web的依赖,SpringBoot就会自动配置Tomcat和SpringMVC。
@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。
SpringBoot 的配置文件
配置文件:
SpringBoot项目使用一个全局的配置文件,配置文件名是固定的 application.properties 或application.yml,一般放在resources目录下或者类路径下的/config下。
Spring Boot 不仅支持常规的 properties 配置文件,还支持 yaml 语言的配置文件。yaml 是以数据为中心的语言,在配置数据的时候具有面向对象的特征。
Spring Boot 的全局配置文件的作用是对一些默认配置的配置值进行修改。
注意: yml 需要在 ":
" 后加一个空格,幸好 IDEA 很好地支持了 yml 文件的格式有良好的代码提示;
封装配置信息:
我们可以把配置信息封装成一个类,首先在我们的 name 和 age 前加一个 student 前缀,然后新建一个 StudentProperties 的类用来封装这些信息,并用上两个注解:
- @Component:表明当前类是一个 Java Bean
- @ConfigurationProperties(prefix = "student"):表示获取前缀为 sutdent 的配置信息
SpringBoot 项目搭建
为了使搭建思路更清晰,我打算利用IntelliJ Idea搭建一个空的SpringBoot项目,然后一步一步将需要的技术集成进SpringBoot。
首先,New 一个 Spring Initializr 项目,全都下一步完成。
完成后Idea会自动配置好一个初始SpringBoot(resources文件夹下面会生成一个空的application.properties文件)。
已经自动生成了主启动类
@SpringBootApplication public class SpringBootDemoApplication { public static void main(String[] args) { SpringApplication.run(SpringBootDemoApplication.class); } }
pom 中已经指明了统一父版本及SpringBoot 依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.8.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
运行启动类,可以看到SpringBoot的Logo。
集成Web 功能
首先引入依赖。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
这样就可以使用SpringMVC的功能了,并且内部集成了Tomcat。
再次启动,这次多了几行
在浏览器中输入 localhost:8080/hello,即可获取到返回的字符串 "Hello SpringBoot"。
devtools 热部署
在目前的 Spring Boot 项目中,当发生了任何修改之后我们都需要重新启动才能够正确的得到效果,这样会略显麻烦,Spring Boot 提供了热部署的方式,当发现任何类发生了改变,就会通过 JVM 类加载的方式,加载最新的类到虚拟机中,这样就不需要重新启动也能看到修改后的效果了。
首先引入依赖。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
重新启动 Spring Boot ,然后修改任意代码,就能观察到控制台的自动重启现象。
SpringBoot 的模板引擎及页面跳转
由于SpringBoot默认的是jar包形式,所以不支持 jsp。因此我们需要模板引擎。
SpringBoot 在 SpringMVC 的视图解析器方面就默认集成了 ContenStNegotiatingViewResolver 和 BeanNameViewResolver,在视图引擎上就已经集成自动配置的模版引擎,如下:
- FreeMarker
- Groovy
- Thymeleaf
- Velocity (deprecated in 1.4)
- Mustache
模板引擎的大致原理:页面+数据交给模板引擎,写一个页面模板,里面一些值是动态的,我们用表达式表达。模板引擎通过数据解析表达式,写到对应位置,最终显示出去。
SpringBoot里面没有我们之前常规web开发的WebContent(WebApp),它只有src目录,在src/main/resources下面有两个文件夹,static 和 templates,springboot默认static中放静态页面,而templates中放动态页面。
Controller 跳转提供了两种方式:
- 是直接返回字符串,字符串为html的名字,视图会自动解析
- 是利用ModelAndView
注意:SpringBoot 加载 html 默认到 resources/templates 里寻找:
@Controller public class TestController { @RequestMapping("/mvc1") public String mvc1(){ return "index"; } @RequestMapping("/mvc2") @ResponseBody public ModelAndView mvc2(){ ModelAndView mv = new ModelAndView("index"); return mv; }
Thymeleaf 模板引擎
首先引入依赖。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
SpringBoot 对 Thymeleaf 的默认配置:
默认前缀:DEFAULT_PREFIX = "classpath:/templates/" 默认后缀:DEFAULT_SUFFIX = ".html" 这完全类似 Spring MVC 的映射规则,如果想修改这些配置只需要在全局配置文件中覆盖修改即可。
所以默认只要把 HTML 页面放在 classpath:/templates/ 下,thymeleaf 就能自动渲染, classpath:/templates/ 目录以外的 html 文件是无法使用 Thymeleaf 引擎的。所以我们也可以自己配置:
spring.thymeleaf.prefiX=classpath:/templates/ spring.thymeleaf.check-template-location=true spring.thymeleaf.suffiX=.html spring.thymeleaf.mode=HTML5 spring.thymeleaf.cache=false
集成Freemarker
首先引入依赖。
在application.properties配置:
spring.freemarker.prefix=.ftl
在resources文件夹下面建立templates文件夹。SpringBoot对Freemarker的默认配置就是Freemarker的模板文件放在resource / templates下面,就可以不需要做任何配置了,SpringBoot会找到它们。
@Controller public class IndexController { @RequestMapping("/getFM.do") public String getFM(){ return "fm"; } }
运行启动类后,在浏览器中输入localhost:8080/getFm.do即可访问到resources文件夹下的fm.ftl文件。
之所以在getFm()方法中直接return "fm" 。就能找到fm.ftl 而不是fm.jsp 是因为freemark模板引擎默认的文件后缀就是.ftl。
集成JSP
JSP技术spring boot 官方是不推荐的,原因有三:
- 在tomcat上,jsp不能在嵌套的tomcat容器解析即不能在打包成可执行的jar的情况下解析
- Jetty 嵌套的容器不支持jsp
- Undertow
首先引入依赖。
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <version>9.0.12</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
在application.properties配置:
# 端口号 server.port=8090 # 默认前缀 spring.mvc.view.prefix=/WEB-INF/jsp/ # 响应页面默认后缀 spring.mvc.view.suffix=.jsp
@Controller public class IndexController { @RequestMapping("/index") public String goIndex(){ return "index"; } }
集成Mybatis
首先引入依赖:
<dependencies> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies>
application.properties 添加数据库和mybatis配置:
# 数据库配置 spring.datasource.url=jdbc:mysql://localhost:3306/jc?useAffectedRows=true&useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT spring.datasource.username=root spring.datasource.password=123456 # 指定 MyBatis 主配置文件的位置 mybatis.config-location=classpath:mybatis-config.xml 指定 mapper 文件的位置。如果在项目中你的 mapper 文件是按目录来放置 mybatis.mapper-location=classpath:mapper/*.xml
mybatis-config.xml 配置:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases> <package name="com.mybatis.domain"/> </typeAliases> <!--<mappers>--> <!--<mapper resource="sample/mybatis/mapper/CityMapper.xml"/>--> <!--<mapper resource="sample/mybatis/mapper/HotelMapper.xml"/>--> <!--</mappers>--> </configuration>
也可以把 mapper 配置在此处,有多少个 mapper 就配置多少次,当然,我们已经在 application.yml
中批量指定了,很方便,就不用在此处一个个写。
添加mapper文件和编写dao代码以及service和controller代码:
- 新建mapper文件,保存所有数据库访问的sql。
- 新建实体类。
- 在dao层下新建mapper里面的方法,方法名与mapper里的sql语句的id要一致
- 在service层新建调用dao层类的逻辑代码。
- 在controller层新建调用service层的逻辑代码。