Spring Boot并不是一个全新的框架,而是将已有的Spring组件整合起来。

Spring Boot可以说是遵循约定优于配置这个理念产生的。它的特点是简单、快速和便捷。

既然遵循约定优于配置,则有一些约定是需要去了解的。虽然说Spring Boot基本上舍弃了XML的配置,但是也不是说是零配置,因为约定也是需要配置来支持的,只是说减少了大量配置。

starter依赖

Spring Boot提供了一系列的Starter依赖来简化jar包依赖的配置。

比如说spring-boot-starter-web等。

运行方式

spring-boot-starter-web中包含了Spring MVC的相关依赖(包含Json支持的Jackson和数据校验的Hibernate Vaildator)和一个内置的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);
} }

在拥有@SpringBootApplication注解的类中,使用SpringApplication类的run方法可以通过Jar启动项目。

如果要通过war来启动项目,则需要继承SpringBootServletInitializer类并实现configure方法,使用SrpingApplicationBuilder类实例的sources方法启动项目。

配置文件

Spring Boot提供了两种默认的配置文件,是在resources资源目录下的application.properties或application.yml。

如果在项目中遇到application.properties出现中文乱码的问题,可以改用yaml。出现这个问题是因为Spring Boot总是会以iso-8859的编码方式读取该文件。而且yaml拥有更简洁的语法,因此更推荐使用application.yml作为默认的配置文件。

配置文件中可以定义一个叫做spring.profiles.active的属性,这个属性可以根据运行环境自动读取不同的、额外的配置文件,例如将该属性定义为dev的话,Spring Boot就会额外地从application-dev.properties/application-dev.yml文件中读取该环境的配置。

Spring Boot注入配置文件属性的方法有两种,一种是通过@Value注解接受配置文件中的属性,另外一种是通过@ConfigurationProperties注解通过set方法自动为Bean注入相应的属性。

通过@Value注入属性,接收者既可以是方法参数,也可以是成员变量。

@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();
}

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/*");
return reg;
}

Spring MVC

Spring MVC的主要配置都可以通过继承WebMvcConfigurerAdapter(或者WebMvcConfigurationSupport)类进行修改,这两个类的主要方法有:

addFormatters:增加格式化工具(用于接收参数)

configureMessageConverters:配置消息转换器(用于@RequestBody和@ResponseBody)

configurePathMatch:配置路径映射

addArgumentResolvers:配置参数解析器(用于接收参数)

addInterceptors:添加拦截器

总之几乎所有关于Spring MVC的配置都可以在这个类中配置。之后只需要将其设为配置类,即在类上注解@Configuration,Spring Boot就会在运行时加载这些配置。

还有一些常用的Bean默认会自动创建,但是可以通过自定义进行覆盖,例如负责@RequestBody和@RequestBody进行转换的MappingJackson2HttpMessageConverter和ObjectMapper,可以直接这样覆盖掉:

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
return new CustomMappingJackson2HttpMessageConverter();
} @Bean
public ObjectMapper jsonMapper(){
ObjectMapper objectMapper = new ObjectMapper();
// null输出空字符串
objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer() {
    @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.datasoruce。并且无需指定数据库的方言,这个Bean会自动根据项目中依赖的数据库驱动判断使用的是那种数据库。

同样的,如果使用了spring-boot-starter-data-redis,也会创建RedisTemplate、ConnectionFactory等Bean。也同样可以在配置文件中定义属性,前缀是spring.redis。

"我还是很喜欢你,像雨洒落在热带与极地,不远万里。"

spring boot中的约定优于配置的更多相关文章

  1. Spring Boot中使用MyBatis注解配置详解(1)

    之前在Spring Boot中整合MyBatis时,采用了注解的配置方式,相信很多人还是比较喜欢这种优雅的方式的,也收到不少读者朋友的反馈和问题,主要集中于针对各种场景下注解如何使用,下面就对几种常见 ...

  2. spring boot 中logback多环境配置

    spring boot 配置logback spring boot自带了log打印功能,使用的是Commons logging 具体可以参考spring boot log 因此,我们只需要在resou ...

  3. 在Spring Boot中动态实现定时任务配置

    原文路径:https://zhuanlan.zhihu.com/p/79644891 在日常的项目开发中,往往会涉及到一些需要做到定时执行的代码,例如自动将超过24小时的未付款的单改为取消状态,自动将 ...

  4. Spring Boot 中使用 @Transactional 注解配置事务管理

    事务管理是应用系统开发中必不可少的一部分.Spring 为事务管理提供了丰富的功能支持.Spring 事务管理分为编程式和声明式的两种方式.编程式事务指的是通过编码方式实现事务:声明式事务基于 AOP ...

  5. Spring Boot中使用@Transactional注解配置事务管理

    事务管理是应用系统开发中必不可少的一部分.Spring 为事务管理提供了丰富的功能支持.Spring 事务管理分为编程式和声明式的两种方式.编程式事务指的是通过编码方式实现事务:声明式事务基于 AOP ...

  6. Spring Boot中以代码方式配置Tomcat

    在Spring Boot2.0以上配置嵌入式Servlet容器时EmbeddedServletContainerCustomizer类不存在,经网络查询发现被WebServerFactoryCusto ...

  7. Spring Boot中使用MyBatis注解配置详解

    传参方式 下面通过几种不同传参方式来实现前文中实现的插入操作. 使用@Param 在之前的整合示例中我们已经使用了这种最简单的传参方式,如下: @Insert("INSERT INTO US ...

  8. Spring Boot2 系列教程(十八)Spring Boot 中自定义 SpringMVC 配置

    用过 Spring Boot 的小伙伴都知道,我们只需要在项目中引入 spring-boot-starter-web 依赖,SpringMVC 的一整套东西就会自动给我们配置好,但是,真实的项目环境比 ...

  9. Spring Boot 中 Druid 的监控页面配置

    Druid的性能相比HikariCp等其他数据库连接池有一定的差距,但是数据库的相关属性的监控,别的连接池可能还追不上,如图: 今天写一下 Spring Boot 中监控页面的配置,我是直接将seat ...

随机推荐

  1. 使用selenium时,使用从系统启动浏览器与通过自动化驱动方式启动浏览器控件ID不一样解决方法

    最近遇到一个怪事,通过正常打开浏览器,按照正常的web登录然后点击进入系统流程,将各控件的ID识别成功,然后使用 python3+selenium写好脚本,高高兴兴的用脚本跑时老是提示找不到控件,然后 ...

  2. 基于diango简易BLOG图片预览

    注册界面 登陆界面 博客主界面 个人站点主页 文章详情页 个人博客后台 添加文章页 修改密码页

  3. UVA1609-Foul Play(构造+递归)

    Problem UVA1609-Foul Play Accept: 101  Submit: 514Time Limit: 3000 mSec Problem Description Input Fo ...

  4. spring程序打包使用该插件,不然容易报错xsd找不到

    <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade ...

  5. php 依赖注入的实现

    当A类需要依赖于B类,也就是说需要在A类中实例化B类的对象来使用时候,如果B类中的功能发生改变,也会导致A类中使用B类的地方也要跟着修改,导致A类与B类高耦合.这个时候解决方式是,A类应该去依赖B类的 ...

  6. jsonp形式的ajax请求:

    sonp形式的ajax请求:并且通过get请求的方式传入参数,注意:跨域请求是只能是get请求不能使用post请求 <!DOCTYPE html> <html> <hea ...

  7. 七彩爱心灯手机APP

    安卓IDE3.20以后不包含sdk,需要更新重新下载. 1 下载工程 https://github.com/Dongvdong/Lovelamp_app 2打开工程 如果换了工程移动换了文件夹 (1) ...

  8. day26 Python __getattribute__

    __getattr__#不存在的属性访问,触发__getattr__ class Foo: def __init__(self,x): self.x=x def __getattr__(self, i ...

  9. 多个窗口开启后,切换到指定title的窗口

    1.在google中,可以开启多个窗口,这是需要切换到自己需要的窗口去定位元素.如下: #获取两个窗口的标题 ${titles} Selenium2Library.Get Window Titles ...

  10. python3 day04 大纲

    上节课内容回顾: 1. 小数据池 存储数据. 共享小数据池 int,str, bool == 和 is区别: == 判断的是两边的值 is 左右两端的内存地址 2. 深浅拷贝 1. = 没有创建新对象 ...