Spring Boot基础讲解
Spring Boot
Spring Boot 是由Pivotal团队提供的框架,它并不是一个全新的框架,而是将已有的 Spring 组件整合起来,设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
其特点是去掉了繁琐的 XML 配置,改使用约定或注解。所以熟悉了 Spring Boot 之后,开发效率将会提升一个档次。约定优于配置的这种做法在如今越来越流行了,它的特点是简单、快速、便捷。但是这是建立在程序员熟悉这些约定的前提上。而 Spring 拥有一个庞大的生态体系,刚开始转到 Spring Boot 完全舍弃 XML 时肯定是不习惯的,所以也会造成一些困扰。这里介绍一下一些常用的心得。
运行方式
spring-boot-starter-web 包含了 Spring MVC 的相关依赖(包括 Json 支持的 Jackson 和数据校验的 Hibernate Validator)和一个内置的 Tomcat 容器,这使得在开发阶段可以直接通过 main 方法或是 JAR 包独立运行一个 WEB 项目。而在部署阶段也可以打成 WAR 包放到生产环境运@SpringBootApplication
public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args); }
}
注解的类中,使用 SpringApplication 的 run/debug 方法可以通过JAR启动项目。继承 SpringBootServletInitializer 类并实现 configure 方法,使用 application 的 sources 方法可以通过WAR启动项目。
运行方式
Spring boot 的默认配置文件是 resources 下的 application.properties (可能会出现中文乱码)和 application.yml (推荐)。
配置文件中可以定义一个叫做 spring.profiles.active 的属性,该属性可以根据运行环境自动读取不同的配置文件。例如将该属性定义为 dev 的话,Spring Boot 会额外从 application-dev.yml 文件中读取该环境的配置。
Spring Boot 注入配置文件属性的方法有两种,一种是通过 @Value 注解接受配置文件中的属性,另外一种是通过 @ConfigurationProperties 注解通过 set 方法自动为Bean注入对应的属性。
通过 @Value 注入属性,接收者既可以是方法参数,也可以是成员变量。例如配置文件为:
dataSource:
url: jdbc:mysql://127.0.0.1:3306/test
username: test
password: test
filters: stat,slf4j redis:
host: 192.168.1.222
port:
通过 @Value 接受方法参数初始化Bean:
@Bean
public JedisPool jedisPool(@Value("${redis.host}") String host, @Value("${redis.port}") int port) { return new JedisPool(host, port); }
通过 @ConfigurationProperties 读取配置初始化Bean,会直接调用对应的set 方法注入:
@Bean(initMethod="init",destroyMethod="close")
@ConfigurationProperties(prefix="dataSource")
public DataSource dataSource() {
return new DruidDataSource();
}
Spring Boot 目前还无法直接注入的静态变量。我目前使用的方法是专门建立一个读取配置文件的Bean,然后使用 @PostConstruct 注解修饰的方法对这些静态属性进行初始化,例如:
@Configuration
public class ConstantsInitializer { @Value("${paging_size}")
private String pagingSize; @PostConstruct
public void initConstants() {
Constants.PAGING_SIZE = this.pagingSize; }
}
Servlet
Servlet 中最重要的配置文件就是 web.xml ,它的主要用途是配置Servlet映射和过滤器。而在 Spring Boot 中这将简单很多,只需要将对应的 Servlet 和 Filter 定义为 Bean 即可。
声明一个映射根路径的 Servlet ,例如 Spring MVC 的 DispatcherServlet :
@Bean
public DispatcherServlet dispatcherServlet() {
return new DispatcherServlet();
}
需要注意的是,Spring Boot 默认会自动创建 DispatcherServlet 的映射。但这是在项目中没有手动声明其他 Servlet Bean 的情况下,否则就需要也将这个 Bean 一起声明。
声明一个映射特定路径的 Servlet ,或是需要配置初始化参数的话,则需要使用 ServletRegistrationBean 。例如 Druid 的 StatViewServlet :
@Bean
public ServletRegistrationBean statViewServlet() {
ServletRegistrationBean reg = new ServletRegistrationBean();
reg.setServlet(new StatViewServlet());
reg.addUrlMappings("/druid/*");
return reg;
}
声明过滤器也是如此,例如 Spring MVC 的 CharacterEncodingFilter :
@Bean
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
filter.setForceEncoding(true);
return filter;
}
复杂一点的同样是通过类似的 FilterRegistrationBean 等,例如:
@Bean
public FilterRegistrationBean appFilter() {
FilterRegistrationBean reg = new FilterRegistrationBean();
reg.setFilter(new LoggingFilter());
reg.addUrlPatterns("/api/test/*");
return reg;
}
Spring MVC
Spring MVC 主要的配置都可以通过继承 WebMvcConfigurerAdapter (或者 WebMvcConfigurationSupport )类进行修改,这两个类的主要方法有:
addFormatters:增加格式化工具(用于接收参数)configureMessageConverters:配置消息转换器(用于@RequestBody和@ResponseBody)configurePathMatch:配置路径映射addArgumentResolvers:配置参数解析器(用于接收参数)addInterceptors:添加拦截器
总之几乎所有关于 Spring MVC 都可以在这个类中配置。之后只需要将其设为 @Configuration ,Spring Boot 就会在运行时加载这些配置。
当然还有一些常用的 Bean 默认会自动创建,但是可以通过自定义进行覆盖,例如负责 @RequestBody 和 @ResponseBody进行转换的 MappingJackson2HttpMessageConverter 和 ObjectMapper ,可以直接这样覆盖掉:
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
return new CustomMappingJackson2HttpMessageConverter();
}
@Bean
public ObjectMapper jsonMapper(){
ObjectMapper objectMapper = new ObjectMapper();
//null输出空字符串
objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
@Override
public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
jgen.writeString("");
}
});
return objectMapper;
}
DataSource
如果使用了 spring-boot-starter-data-jpa ,Spring Boot将会自动创建一个 DataSource Bean。可以直接在配置文件中定义它的属性,前缀是spring.datasource 。并且无需指定数据库的方言,这个 Bean 会自动根据项目中依赖的数据库驱动判断使用的哪种数据库。
同样的,如果使用了 spring-boot-starter-data-redis ,也会自动创建 RedisTemplate 、 ConnectionFactory 等 Bean。也同样可以在配置文件中定义属性,前缀是 spring.redis 。
Spring Boot基础讲解的更多相关文章
- Spring Boot 基础教程系列学习文档
Spring Boot基础教程1-Spring Tool Suite工具的安装 Spring Boot基础教程2-RESTfull API简单项目的快速搭建 Spring Boot基础教程3-配置文件 ...
- Spring Boot 基础
Spring Boot 基础 Spring Boot 项目(参考1) 提供了一个类似ASP.NET MVC的默认模板一样的标准样板,直接集成了一系列的组件并使用了默认的配置.使用Spring Boot ...
- spring boot基础 入门
spring boot基础 spring boot 的简单搭建 spring boot 的基本用法 spring boot 基本用法 自动配置 技术集成 性能监控 源码解析 工程的构建 创建一个mav ...
- Spring Boot基础教程》 第1节工具的安装和使用
<Spring Boot基础教程> 第1节 工具的安装和使用 Spring Boot文档 https://qbgbook.gitbooks.io/spring-boot-reference ...
- spring boot基础学习教程
Spring boot 标签(空格分隔): springboot HelloWorld 什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新 ...
- Spring Boot 基础,理论,简介
Spring Boot 基础,理论,简介 1.SpringBoot自动装配 1.1 Spring装配方式 1.2 Spring @Enable 模块驱动 1.3 Spring 条件装配 2.自动装配正 ...
- Java Web系列:Spring Boot 基础
Spring Boot 项目(参考1) 提供了一个类似ASP.NET MVC的默认模板一样的标准样板,直接集成了一系列的组件并使用了默认的配置.使用Spring Boot 不会降低学习成本,甚至增加了 ...
- Java Web系列:Spring Boot 基础 (转)
Spring Boot 项目(参考1) 提供了一个类似ASP.NET MVC的默认模板一样的标准样板,直接集成了一系列的组件并使用了默认的配置.使用Spring Boot 不会降低学习成本,甚至增加了 ...
- Spring Boot - 基础 POM 文件
表 1. Spring Boot 推荐的基础 POM 文件 名称 说明 spring-boot-starter 核心 POM,包含自动配置支持.日志库和对 YAML 配置文件的支持. spring-b ...
随机推荐
- CF 833B
互测题T3... 首先有个dp是非常好想的: 设dp[i][j]为前j个数分成i组的最大得分,则易得:dp[i][j]=max{dp[i-1][k-1]+num[k][j]},其中,num[k][j] ...
- Python列表、元组、字典和集合的区别
数据结构 是否可变 是否重复 是否有序 定义符号 列表(list) 可变 可重复 有序 [] 元组(tuple) 不可变 可重复 有序 () 字典(dictionary) 可变 可重复 无序 {key ...
- Allegro PCB Design GXL (legacy) 设置十字大光标
Allegro PCB Design GXL (legacy) version 16.6-2015 1.菜单:Setup > User Preferences... 2.User Prefere ...
- AI学习吧-登录注册
登录注册注销 如果需要给表设置权限,没有登录就不可以查看,只需要在每个视图函数之前加上Auth_classes=[ ]即可! 增加两张表,做登录认证 #models.py #做登录验证 class U ...
- 如何用TortoiseSVN对文件进行操作
我们如何用TortoiseSVN修改文件,添加文件,删除文件,以及如何解决冲突等. 添加文件 在检出的工作副本中添加一个Readme.txt文本文件,这时候这个文本文件会显示为没有版本控制的状态,如图 ...
- 论文阅读笔记三十二:YOLOv3: An Incremental Improvement
论文源址:https://pjreddie.com/media/files/papers/YOLOv3.pdf 代码:https://github.com/qqwweee/keras-yolo3 摘要 ...
- java数组元素的复制
package day03; import java.util.Arrays; /** * * 数组元素的复制: int的默认值是0,boolean默认值是flase 数组的扩容和缩容(本质的实现数组 ...
- 51 NOd 1459 迷宫游戏 (最短路径)
1459 迷宫游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间, ...
- azkaban安装使用
本文记录azkaban的安装和 一些报错处理(文章末尾). AzKaban组成 MySQL数据库,azkaban-server (web端),azkaban-executor (执行job) 1.下载 ...
- Leetcode 344. 反转字符串
344. Reverse String 解题代码: class Solution { public: void reverseString(vector<char>& s) { , ...