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。
"我還是很喜歡你,像雨灑落在熱帶與極地,不遠萬里。"