• 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。

    一、Maven的目录结构:

    默认有resources文件夹存放配置文件。
    默认打包方式为jar。
    二、默认的配置文件:application.properties 或 application.yml 文件

    三、默认通过 spring.profiles.active 属性来决定运行环境时的配置文件。

    四、EnableAutoConfiguration 默认对于依赖的 starter 进行自动装载。

    五、spring-boot-start-web 中默认包含 spring-mvc 相关依赖以及内置的 tomcat 容器,使得构建一个 web 应用更加简单。

  • 相关阅读:
    [恢]hdu 2391
    [恢]hdu 2352
    [恢]hdu 2393
    [恢]hdu 1868
    [恢]hdu 1279
    [恢]hdu 2086
    [恢]hdu 1405
    [恢]hdu 2088
    [恢]hdu 2106
    [恢]hdu 2537
  • 原文地址:https://www.cnblogs.com/mike-mei/p/15241915.html
Copyright © 2020-2023  润新知