spring boot中的約定優於配置


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。

 

"我還是很喜歡你,像雨灑落在熱帶與極地,不遠萬里。"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM