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 ...
随机推荐
- name
问题 A: name 时间限制: 1 Sec 内存限制: 256 MB 题目描述 lpq同学最近突然对外国人的名字产生了兴趣,特别是外国女生的名字,于是他开始试图去认识一些国外的女生. 随着认识的女 ...
- jenkins持续集成:定时构建语法
构建位置:选择或创建工程_设置_构建触发器 1. 定时构建语法:* * * * * (五颗星,多个时间点,中间用逗号隔开)第一个*表示分钟,取值0~59第二个*表示小时,取值0~23第三个*表示一个月 ...
- Google C++ 代码规范
Google C++ Style Guide Table of Contents Header Files Self-contained Headers The #define Guard For ...
- Java+selenium之WebDriver的cookie,等待等高级操作(五)
1. 操作cookie // 增加一个 name = "name",value="value" 的 cookie Cookie cookie = new Coo ...
- Controller中方法返回值其他类型需要添加jackson依赖
第一个 第二个: 第三个 https://www.cnblogs.com/codejackanapes/p/5569013.html:json的博客园 springmvc默认的是:2.Jackson: ...
- 封装cuda/cudnn写卷积网络前向计算程序
目录 基本编译配置 一些常识 BN层的坑 cuda基础 向cuda核函数传入结构体指针? 参考:http://galoisplusplus.coding.me/blog/2018/05/22/cuda ...
- nunit单元测试详解
在粗略看了代码后,下面就详细说明相应的测试标记(属性)的用法. [TestFixture(arguments)]属性标记类为测试类,若没有填写参数,则测试类必须含有无参构造函数,否则需要相应的有参构造 ...
- python---冒泡和短冒泡排序
冒泡是最费时的排序,但可以自定义更多步骤. 短冒泡确实可以加快性能. # coding = utf-8 # ========冒泡排序======== def bubble_sort(a_list): ...
- bzoj4059
题解: 还是一道不错的题目 首先它要求每个区间都满足要求,所以我们很容易想到将它映射到二维平面上 然后我们算出每个数的前驱以及后继li,ri 那么第一维是li-i,第二维是i-ri的区间就是合法的,同 ...
- [转]利用ssh传输文件
利用ssh传输文件 http://www.cnblogs.com/jiangyao/archive/2011/01/26/1945570.html 在linux下一般用scp这个命令来通过ssh传输文 ...