SpringBoot
Spring框架发展史
Spring1.x 时代
在Spring1.x时代,都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配
置文件中,需要频繁的在java类和xml配置文件中切换。
Spring2.x时代
随着JDK 1.5带来的注解支持,Spring2.x可以使用注解对Bean进行申明和注入,大大的减少了xml配置
文件,同时也大大简化了项目的开发。
那么,问题来了,究竟是应该使用xml还是注解呢?
最佳实践:
- 应用的基本配置用xml,比如:数据源、资源文件等;
- 业务开发用注解,比如:Service中注入bean等;
Spring3.x到Spring4.x再到Spring5.x
从Spring3.x开始提供了Java配置方式,使用Java配置方式可以更好的理解你配置的Bean,现在我们就处
于这个时代,并且Spring4.x、Spring5.x和Spring Boot都推荐使用java配置的方式。
Spring 5.X 应用零配置开发
Spring 框架从5.x版本推荐使用注解形式来对java应用程序进行开发与配置,并且可以完全替代原始的
XML+注解形式的开发,在使用注解形式进行项目开发与环境配置时,Spring 框架提供了针对环境配置与
业务bean开发相关注解。
注解
一、web mvc开发时,对于三层的类注解
1.1 @Controller
应用在MVC层(控制层),DispatcherServlet会自动扫描注解了此注解的类,然后将web请求映射到注解了@RequestMapping的方法上。
1.2 @Service
应用在service层(业务逻辑层)
1.3 @Reponsitory
应用在dao层(实现类)(数据访问层)
1.4 @component
表示一个带注释的类是一个“组件”,成为Spring管理的Bean。当使用基于注解的配置和类路径扫描时,这些类被视为自动检测的候选对象。同时@Component还是一个元注解。
注意: @Controller、@Service、@Reponsitory都组合了 @Component注解。为了区分三层不同的作用,因此分别为三层起了不同的名字。
二、依赖注入的注解
依赖注入有那种方式,++jdk中的@Resource,spring中的@Autowired++
2.1@Autowired
由Spring的依赖注入工具(BeanPostProcessor、BeanFactoryPostProcessor)自动注入,Spring提供的工具。这个注解是最常用的注解。
2.2 @Resource
依赖注入,给对象的属性注入数据,可以定义在字段上,也可以定义在方法上。一般用在注入dao层数据源,跟@Autowired相似,区别就是@Autowired默认是先根据类型,而@Resource默认是先根据名称。
2.3 @Resource、@Autowired的区别
@Resource的作用相当于@Autowired,只不过@Autowired默认按byType自动注入,而@Resource默认按byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为code>bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序:
1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
2.4 @Value
由于@Autowired、@Qualifier、@Resource三者自动装配只能针对于注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现。因此有了@Value这个注解,@Value专门用来服务基本类型和String类型
@Value注解有一个value 属性:用于指定数据的值。它可以使用spring中SpEL(也就是spring的EL表达式)。SpEL的写法:${表达式},也可以类似mybatis中的 #{表达式} 的写法(SpEL的写法一般操作配置文件中数据)
总结:通过@Value注解将常量、配置文件中的值、其他bean的属性值注入到变量中,作为变量的初始值。支持表达式、直接赋值、配置文件三种方式。
2.5 @Data
lombok插件中的注解,用于自动生成get()、 set()、 toString()等方法
三、WEB 常用的注解
3.1 @RequestMapping
用来映射web请求(访问路径和参数),处理类和方法的。可以注解在类和方法上,注解在方法上的@RequestMapping路径会继承注解在类上的路径。同时支持Serlvet的request和response作为参数,也支持对request和response的媒体类型进行配置。其中有value(路径),produces(定义返回的媒体类型和字符集),method(指定请求方式)等属性。
注意:@GetMapping和@PostMapping是@RequestMapping的两种特例,一个是get方式请求,一个是post方式
3.2 @RequestParam
将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)
语法1:
@RequestParam(value=”参数名”,required=“true/false”,defaultValue=””)
++value++:参数名
++required++:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。
++defaultValue++:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,
就使用默认值
语法2:
@RequestParam(“参数名”)
注意: url中请求的参数名称一定要和@RequestParam(value=“”)中value的值保持一致。
3.3 @PathVariable
@PathVariable 放置在参数前,用来接受路径参数。
@GetMapping(value = "hostelRooms/{id}")
public AjaxResult getInfo(@PathVariable(value="id") Long id){
return success(hostelRoomsService.selectHostelRoomsById(id));
}
这里的{id}就是我们定义的变量规则,id是变量的名字, 注解@PathVariable(value=“id”) Long id 会获取变量的值为方法中的参数赋值
3.4 @RequestParam和@PathVariable区别
前者是在url中以参数方式传输,后者在请求url路径中根据变量传输,二者的应用场景建议如下:
1、当URL指向的是某一具体业务资源(或资源列表),使用@PathVariable
2、当URL需要对资源或者资源列表进行过滤,筛选时,用@RequestParam
3.5 @ResponseBody和@RequestBody
@ResponseBody:将返回值放在response体内。返回的是数据而不是页面。在异步请求返回json数据时使用。
@RequestBody:允许request的参数在request体中,而不是在直接链接在地址的后面。此注解放置在参数前。比如:直接以String接收前端传过来的json数据
3.6 @RestController
- 组合注解,组合了@Controller和@ResponseBody,当我们只开发一个和页面交互数据的控制层的时候可以使用此注解。
- 使用此注解后,在方法层就不用添加@ResponseBody注解了,并且这个类中所有的方法都默认添加了@ResponseBody注解,都返回的是数据而不是界面。
3.7 @ControllerAdvice和@ExceptionHandler
@ControllerAdvice用在类上,声明一个控制器建言,它也组合了@Component注解,会自动注册为Spring的Bean。
@ExceptionHandler用在方法上定义全局处理,通过他的value属性可以过滤拦截的条件:@ExceptionHandler(value=Exception.class)–表示拦截所有的Exception。
四、Spring Boot常用的注解
4.1 @SpringBootApplication:启动
SpringBoot的核心注解,主要目的是开启自动配置。它也是一个组合注解,主要组合了@Configuration,@EnableAutoConfiguration(核心)和@ComponentScan。可以通过@SpringBootApplication(exclude={想要关闭的自动配置的类名.class})来关闭特定的自动配置,其中@ComponentScan让spring Boot扫描到Configuration类并把它加入到程序上下文。
4.2 @EnableAutoConfiguration:自动配置
此注释自动载入应用程序所需的所有Bean——这依赖于Spring Boot在类路径中的查找。该注解组合了@Import注解,@Import注解导入了EnableAutoCofigurationImportSelector类,它使用SpringFactoriesLoader.loaderFactoryNames方法来扫描具有META-INF/spring.factories文件的jar包。而spring.factories里声明了有哪些自动配置.
4.3 @Configuration:配置文件
等同于spring的XML配置文件;使用Java代码可以检查类型安全。
4.4 @ComponentScan:自动扫描
表示将该类自动发现扫描组件。如果扫描到有@Component、@Controller、@Service等这些注解的类,并注册为Bean,可以自动收集所有的Spring组件,包括@Configuration类。
五、AOP常用的注解
5.1 @Aspect:切面
声明一个切面
5.2 @After:后置建言
后置建言(advice),在原方法前执行
5.3 @Before:前置建言
前置建言(advice),在原方法后执行。
5.3 @Around:环绕
环绕建言(advice),在原方法执行前执行,在原方法执行后再执行(@Around可以实现其他两种advice)。
5.3 @PointCut:切点
声明切点,即定义拦截规则,确定有哪些方法会被切入
六、测试常用的注解
6.1 @SpringBootTest
@SpringBootTest注解是SpringBoot Since:1.4.0 版本开始引入的一个用于测试的注解。
6.2 @Test
将一个普通方法修饰为一个测试方法。
6.3 @RunWith
这个是Junit的注解,springboot集成了junit。一般在测试类里使用:@RunWith(SpringJUnit4ClassRunner.class)
— SpringJUnit4ClassRunner在JUnit环境下提供Sprng TestContext Framework的功能
最主要是声明测试的运行器,都在org.junit.runners下。
@RunWith(SpringRunner.class) ,表明这个类中的测试用例需要使用SpringRunner类来执行。
6.4 其他测试注解
- @Ignore : 用于暂时忽略某个测试方法或测试类
- @Before: 每一个测试方法之前运行
- @After : 每一个测试方法之后运行
- @BeforeClass: 所有测试开始之前运行
- @AfterClass: 所有测试结束之后运行
七、其他常用注解
7.1 @Transactional:事务声明
声明事务(一般默认配置即可满足要求,当然也可以自定义)
7.2 @Cacheable:缓存
声明数据缓存
7.3 @PropertySource:文件引入
指定文件地址。提供了一种方便的、声明性的机制,用于向Spring的环境添加PropertySource。与@configuration类一起使用。
实例-读取外部配置文件
在开发Java web 应用进行时,配置文件是比较常见的,比如xml,properties,yml等文件,在Spring 应用中
对于配置文件的读取同样提供支持。对于配置文件读取,我们可以通过@PropertySource 注解声明到类
级别来指定读取相关配置配置。
Spring El表达式语言,支持在Xml和注解中使用表达式,类似于JSP中EL表达式,Spring框架在借助该表
达式实现资源注入,主要通过@Value 注解来使用表达式,通过@Value 注解,可以实现普通字符串,表
达式运算结果,Bean 属性文件内容,属性文件等参数注入。具体使用如下:
准备properties 配置文件
src/main/resources 目录下添加user.properties jdbc.roperties 文件
# user.properties
user.userName=admin
user.password=admin
# jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/hr?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=root
@PropertySource加载properties配置文件
@Configuration
@ComponentScan("com.shsxt")
@PropertySource(value =
{"classpath:jdbc.properties","classpath:user.properties"})
public class IocConfig {
@Value("${jdbc.driver}")
private String url;
@Value("${jdbc.url}")
private String driver;
@Value("${jdbc.username}")
private String userName;
@Value("${jdbc.password}")
private String password;
@Bean
public AccountDao accountDao(){
return new AccountDao();
}
// 控制台打印属性值信息
public void showConfigInfo(){
src/main/resources 目录下添加user.properties jdbc.roperties 文件
其他Bean对象获取properties文件内容
在需要读取配置文件值得属性上添加@Value("${}")
//获取properties配置文件中得定义得username的值
@Value("${user.userName}")
private String userName;
7.4 @Async:多线程异步方法
注解在方法上标示这是一个异步方法,在类上标示这个类所有的方法都是异步方法。
7.5 @EnableAsync:多线程
开启异步任务支持。注解在配置类上。
7.6 @EnableScheduling:开启计划任务
注解在配置类上,开启对计划任务的支持。
7.7 @Scheduled:计划任务
注解在方法上,声明该方法是计划任务。支持多种类型的计划任务:cron,fixDelay,fixRate。
组合注解与元注解
Spring 从2.x版本开始引入注解支持(目的是jdk1.5中推出注解功能),通过引入注解来消除大量xml 配
置,Spring 引入注解主要用来注入bean以及aop 切面相关配置,但由于注解大量使用,就会造成大量重复
注解代码出现,代码出现了重复,Spring 为了消除重复注解,在元注解上引入了组合注解,其实可以理
解为对代码的重构,相当于注解的注解,拥有元注解的原始功能,比如在定义配置类时用到的
@Configuration 注解就是组合注解,拥有Component 注解功能,即配置类本身也是一个被Ioc维护的
单例Bean。
自定义组合注解
1.设置元注解
@Retention(RetentionPolicy.RUNTIME)//定义指注解的保留策略,注解在何时生效,@Retention注解有三种保留策略:
- RetentionPolicy.SOURCE:编译器在编译时丢弃该注解,不会包含在编译后的class文件中。
- RetentionPolicy.CLASS:注解会被包含在class文件中,但在运行时会被JVM丢弃。
- RetentionPolicy.RUNTIME:注解会被包含在class文件中,并且在运行时可以通过反射机制获取到。
@Target(ElementType.TYPE)//定注解可以应用的目标元素类型,即注解可以放置在哪些程序元素上。
在Java中,@Target注解定义了一个ElementType枚举类型,表示注解可以应用的目标元素类型,包括以下几种:
ElementType.ANNOTATION_TYPE:可以应用在注解类型上。
ElementType.CONSTRUCTOR:可以应用在构造方法上。
ElementType.FIELD:可以应用在字段上。
ElementType.LOCAL_VARIABLE:可以应用在局部变量上。
ElementType.METHOD:可以应用在方法上。
ElementType.PACKAGE:可以应用在包上。
ElementType.PARAMETER:可以应用在方法参数上。
ElementType.TYPE:可以应用在类、接口(包括注解类型)或枚举声明上。
通过指定@Target注解,可以限制注解的使用范围,避免将注解错误地放置在不允许的元素上。
参考@MyCompScan注解
2.添加想要组合注解
定义MyCompScan 注解,拥有@ComponentScan 扫描器注解功能
/**
* 组合注解MyCompScan 定义
* 拥有元注解@Configuration + @ComponentScan 两者功能
* 覆盖value 属性
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Configuration
@ComponentScan
public @interface MyCompScan {
//覆盖@Configuration注解里的扫描路径
String[] value() default {};
}
SpringMVC零配置创建与部署
基于Spring Mvc 5.X 使用Maven搭建SpringMvc Web项目,通过Spring 提供的注解与相关配置来对项目进行创建与部署。
创建Spring Mvc Web工程
pom.xml添加坐标相关配置
<!-- spring web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<!-- spring mvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<!-- web servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
<build>
<finalName>springmvc</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.4.27.v20200227</version>
</plugin>
</plugins>
</build>
添加源代码
@Controller
public class HelloController {
@RequestMapping("/index")
public String index(){
return "index";
}
}
添加视图
在WEB-INF/views 目录下创建index.jsp(这里以jsp为模板)
<html>
<body>
<h2>test web mvc</h2>
</body>
</html>
SpringMvc配置类添加
自定义MvcConfig配置类,配置视图解析器
Spring Mvc 配置信息MvcConfig文件添加,作为Mvc 框架环境,原来是通过xml来进行配置(视图解析器,Json转换器,文件上传解析器等),这里基于注解通过继承WebMvcConfigurerAdapter类 并重写相关方法来进行配置(注意通过@EnableWebMvc注解来启动MVC环境)。
/**
* mvc 基本配置
*/
@Configuration
@EnableWebMvc
@ComponentScan("com.xxxx.springboot")
public class MvcConfig{
@Bean
public InternalResourceViewResolver viewResolver(){
InternalResourceViewResolver viewResolver=new
InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
}
在构建Mvc应用时是通过容器,启动应用时加载web.xml 文件 实现配置文件加载,现在的环境web.xml文件不存在,此时基于注解方式构建的Mvc 应用,定义WebInitializer 实现WebApplicationInitializer接口(该接口用来配置
Servlet3.0+配置的接口,用于替代web.xml 配置),当servlet 容器启动Mvc应用时会通过SpringServletContainerInitializer接口进行加载 从而加载Mvc 应用信息配置。实现该接口onStartup 方法 ,加载应用信息配置。
入口文件代码添加
public class WebInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException
{
AnnotationConfigWebApplicationContext ctx=new
AnnotationConfigWebApplicationContext();
// 注册Mvc 配置信息
ctx.register(MvcConfig.class);
// 设置ServletContext 上下文信息
ctx.setServletContext(servletContext);
// 配置中央控制器Dispatcher
ServletRegistration.Dynamic
servlet=servletContext.addServlet("dispatcher",new DispatcherServlet(ctx));
servlet.addMapping("/");
// 启动时即实例化Bean
servlet.setLoadOnStartup(1);
}
}
如果需要使用拦截器或者其他相关的配置,则需要继承父类WebMvcConfigurationSupport,重写相关方法
// 静态资源 handler不进行处理 直接响应到客户端
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer
configurer) {
configurer.enable();
}
// 配置拦截器
@Bean
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
// 添加拦截器到mvc 环境
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor());
}
Spring Boot 概念&特点
Spring Boot是由Pivotal团队提供的一套开源框架,可以简化spring应用的创建及部署。它提供了丰富的Spring模块化支持,可以帮助开发者更轻松快捷地构建出企业级应用。Spring Boot通过自动配置功能,降低了复杂性,同时支持基于JVM的多种开源框架,可以缩短开发时间,使开发更加简单和高效。
Spring Boot 核心配置
Spring Boot 配置文件
Spring Boot 默认会读取全局配置文件,配置文件名固为:application.properties或application.yml,放置在src/main/resources资源目录下,使用配置文件来修改SpringBoot自动配置的默认值
1、参数配置化
2、yml配置文件(层级结构)
yml和yaml,格式一样
基本语法:
- 大小写敏感
- 数值前边必须有空格,作为分隔符
- 使用缩进表示层级关系,缩进时,不允许使用Tab键,只能用空格(idea中会自动将Tab转换为空格)
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- #表示注释,从这个字符一直到行尾,都会被解析器忽略
3、@ConfigurationProperties
使用步骤:
1、定义一个配置属性类
2、在类中定义getter和setter方法(@Data)
3、将类交给IOC容易管理,成为IOC容器中的bean对象(@Component)
4、使用@ConfigurationProperties定义前缀字段(@ConfigurationProperties(prefix = “前缀字段”))
给自定义的配置,配置提示依赖:
@configurationProperties 与@Value
相同点:
- 都是用来注入外部配置的属性的。
不同点:
- @Value注解只能一个一个的进行外部属性的注入。
- @ConfigurationProperties可以批量的将外部的属性配置注入到bean对象的属性中。
Starter 坐标 & 自动化配置
Starter坐标配置
Spring Boot 引入了全新的Starter坐标体系,简化企业项目开发大部分场景的Starter pom,应用程序引入指定场景的Start pom 相关配置就可以消除 ,通过Spring Boot就可以得到自动配置的Bean。
自动化配置
springboot中项目中引入的starter 系列坐标对应的版本库统一由父工程坐标统一控制即项目中引入的parent标签。(spring-boot-dependencies 项目中定义了当前SpringBoot版本下各个starter 坐标版本以及依赖的其他坐标版本)
Spring Boot自动化配置
Spring Boot的项目一般都会有*Application的入口类,入口类中提供main方法,这是一个标准的Java应用程序的入口方法。@SpringBootApplication注解是Spring Boot的核心注解,它其实是一个组合注解:
@SpringBootApplication
该注解组合了@Configuration注解,对于Spring Boot应@SpringBootConfiguration 注解属于Boot 项目的配置注解也是属于一个组合注解,Spring Boot 项目中推荐使用@SpringBootConfiguration注解,因为其组合了@Configuration注解。
@EnableAutoConfiguration
@EnableAutoConfiguration注解组合了@AutoConfigurationPackage、@Import(AutoConfigurationImportSelector.class) 注解。
@Import(AutoConfigurationImportSelector.class) 自动配置的核心类
AutoConfigurationImportSelector.class,该类导入大量的自动配置类,debug可以发现,其读取的是classpath下的META-INF/spring.factories下配置文件。
@AutoConfigurationPackage底层也是一个@Import(AutoConfigurationPackages.Registrar.class),其会把启动类的包下组件都扫描到Spring容器中。
以WebMvcAutoConfiguration为例,可以看出该类使用@Configuration 注解进行标注其为一个配置类。
**注意:**spring.factories 文件中配置类默认不会都生效,具体哪些配置类生效由配置类上标注的@ConditionalOnClass 注解来决定。
@ConditionalOnClass 注解含义
- @ConditionalOnBean // 当给定的在bean存在时,则实例化当前Bean
- @ConditionalOnMissingBean // 当给定的在bean不存在时,则实例化当前Bean
- @ConditionalOnClass // 当给定的类名在类路径上存在,则实例化当前Bean
- @ConditionalOnMissingClass // 当给定的类名在类路径上不存在,则实例化当前Bean
因此WebMvcAutoConfiguration 配置类生效需要环境中存在Servlet.class,
DispatcherServlet.class,WebMvcConfigurer.class实例,配置类才会生效。
结论:
Spring Boot通过maven中的starter导入了所需场景下的jar包,并通过主启动类上的@SpringBootApplication中的@EnableAutoConfiguration读取了类路径下的META-INF/spring.factories下EnableAutoConfiguration的配置类,这些配置类使用@ConditionalOnClass来标注,根据@ConditionalOnClass标注的约束条件来引入自动化的环境配置。
Profile 配置
Profile 是Spring 用来针对不同环境对不同配置提供支持的全局Profile配置使用application-{profile}.yml,比如application-dev.yml ,application-test.yml。
通过在application.yml中设置spring.profiles.active=test|dev|prod 来动态切换不同环境
- application.yml 主配置文件
## 环境选择配置
spring:
profiles:
active: dev
日志配置
Spring Boot默认使用LogBack日志系统,如果不需要更改为其他日志系统如Log4j2等,则无需多余的配置,LogBack默认将日志打印到控制台上。
新建的Spring Boot项目一般都会引用 spring-boot-starter 或者 spring-boot-starter-web ,而这两个起步依赖中都已经包含了对于 spring-boot-starter-logging 的依赖,所以,无需额外添加依赖。
日志输出格式配置
修改application.yml文件添日志输出格式信息配置,可以修改application.yml文件来控制控制台日志输出格式,同时可以设置日志信息输出到外部文件。
logging:
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger- %msg%n"
level: debug
file:
path: "."
name: "springboot.log"
Freemarker & Thymeleaf视图技术集成
Freemarker 视图集成
SpringBoot内部支持Freemarker 视图技术的集成,并提供了自动化配置类FreeMarkerAutoConfiguration,借助自动化配置可以很方便的集成Freemarker基础到SpringBoot环境中。这里借助入门项目引入Freemarker环境配置。
- starter坐标引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
- 添加Freemarker 配置信息
Freemarker 默认视图路径文 resources/templates 目录(由自动化配置类
FreemarkerProperties 类决定),该目录可以进行在application.yml 中进行修改。
修改application.yml 添加freemarker 基本配置如下:
spring:
freemarker:
suffix: .ftl
content-type: text/html
charset: UTF-8
template-loader-path: classpath:/views/
Thymeleaf视图集成
SpringBoot 支持多种视图技术集成,并且SpringBoot 官网推荐使用Thymeleaf 作为前端视图页面,这里实现Thymeleaf 视图集成,借助入门项目引入Thymeleaf 环境配置。
- starter坐标引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
- 添加Thymeleaf 配置信息
Thymeleaf 默认默认视图路径文 resources/templates 目录(由自动化配置类
FreemarkerProperties 类决定),该目录可以进行在application.yml 中进行修改。
修改application.yml 添加Thymeleaf 基本配置如下:
## 环境选择配置
spring:
thymeleaf:
prefix: classpath:/html/
## 关闭thymeleaf 页面缓存
cache: false
SpringBoot 静态资源访问
Spring Boot 默认静态资源路径如下:
public class ResourceProperties {
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]
{"classpath:/META-INF/resources/", "classpath:/resources/",
"classpath:/static/", "classpath:/public/"};
private String[] staticLocations;
private boolean addMappings;
private final ResourceProperties.Chain chain;
private final ResourceProperties.Cache cache;
可以看出存放路径默认在resources/static或者/public;可存放images、js、css等静态资源文件。
SpringBoot应用打包与部署
当项目开发完毕进行部署上线时,需要对项目进行打包操,入门中构建的项目属于普通应用,由于SpringBoot内嵌Tomcat容器,所有打包后的jar包默认可以自行运行。
Jar 包部署
配置打包命令
idea 下配置clean compile package -Dmaven.test.skip=true 执行打包命令,正常执行后target目录得到待部署的项目文件。
部署并访问
打开本地dos 窗口,执行jawva -jar 命令 部署已打好的jar包文件
war包部署
war 包形式部署Web 项目在生产环境中是比较常见的部署方式,也是目前大多数web 应用部署的方案,这里对于Spring Boot Web 项目进行打包部署步骤如下
pom.xml修改
- 应用类型修改
- - 内嵌tomcat忽略
构建SPringBoot应用时,引入的spring-boot-starter-web默认引入tomcat容器,这里忽略掉内容tomcat
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<build>
<!-- 配置生成的war文件名-->
<finalName>springboot</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Starter修改
添加容器启动加载文件(类似于读取web.xml),这里通过继承SpringBootServletInitializer 类并重写configure方法来实现,在部署项目时指定外部tomcat 读取项目入口方法。
@SpringBootApplication
public class Starter extends SpringBootServletInitializer {
private static Logger logger = LoggerFactory.getLogger(Starter.class);
public static void main(String[] args) {
logger.info("SpringBoot 应用开始启动...");
SpringApplication.run(Starter.class);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder
builder) {
return builder.sources(Starter.class);
}
}
部署并访问
外部tomcat部署并访问
将打包好的war包放在tomcat文件夹下的webapps文件夹下,startup.bat启动tomcat以运行项目。