4.2. SpringBoot配置使用之配置类使用

Spring Boot的大部分自动配置都可以满足应用要求,但如果想精确的控制应用,或者想覆盖自动配置,使用配置类是另一种很好的选择,强调一下,Spring Boot主要使用配置文件和配置类来做配置。

1. 启动类

在创建Spring Boot工程的时候会根据工程打包的选择方式,自动生成两个类,一个用于本地启动和以打成jar包方式启动,一个是以War包方式启动的两个最重要的配置类。笔者称为启动类。

代码如下:

(1)jar启动类:

关于SpringApplication我们可以做一些定制,如下简单演示:

SpringApplication app = newSpringApplication(MySpringConfiguration.class);
   app.setBannerMode(Banner.Mode.OFF);
app.run(args);

上述代码是以代码的方式关闭Spring Boot的banner显示。

new SpringApplicationBuilder()
       .sources(Parent.class)
       .child(Application.class)
       .bannerMode(Banner.Mode.OFF)
       .run(args);

通过上面代码可以跟其他的Application进行父子上下文的关联,不再测试。

2war启动类

实际上方式基本相似代码如下:

@SpringBootApplication()
public classHelloworldApplication extends SpringBootServletInitializer {
 
      @Override
      protected SpringApplicationBuilderconfigure(SpringApplicationBuilder application) {
             returnapplication.sources(HelloworldApplication.class);
      }

 

主要是继承SpringBootServletInitializer后重写configure()方法而方法中内容跟jar启动是的main方法一致。

具体可自行研究。

示例如下:

spring boot 属性配置 springboot配置类详解_Web

 

2. 配置首页

 

在应用中配置应用的首页有多种方式,有一种是在web.xml中配置,使用welcome元素配置首页,在Spring Boot中如何配置,演示如下:

编写代码:

spring boot 属性配置 springboot配置类详解_类名_02

编写简单测试主页:

spring boot 属性配置 springboot配置类详解_Web_03

启动测试:

spring boot 属性配置 springboot配置类详解_类加载器_04

3. 配置Bean

 

开发中肯定会有场景需要自定义Bean并加入IOC容器中,可以使用@Component注解,当无法使用注解时可使用如下方法,在类上加入@Configuration,在方法上加入注解@Bean,测试代码如下:创建实体bean

spring boot 属性配置 springboot配置类详解_Spring Boot_05

创建配置类,在类上加入注解@Configuration,创建配置方法在方法上加入注解@Bean即可:

spring boot 属性配置 springboot配置类详解_类加载器_06

测试代码:

spring boot 属性配置 springboot配置类详解_类加载器_07

启动访问测试:

spring boot 属性配置 springboot配置类详解_Spring Boot_08

4. 条件化配置Bean

 

 

开发时会遇到场景:有些bean的初始化需要依赖其他Bean或根据条件来决定要不要初始化。Spring Boot提供多种条件注解满足需求,事实上Spring Boot应用的自动装配很大一部分Bean是根据条件注解实现的。

 

具体注解和介绍如下:

1.     @ConditionalOnBean:Spring容器中是否存在对应的实例。可以通过实例的类型、类名、注解、昵称去容器中查找(可以配置从当前容器中查找或者父容器中查找或者两者一起查找)这些属性都是数组,通过"与"的关系进行查找。

2.     @ConditionalOnClass: 类加载器中是否存在对应的类。可以通过Class指定(value属性)或者Class的全名指定(name属性)。如果是多个类或者多个类名的话,关系是"与"关系,也就是说这些类或者类名都必须同时在类加载器中存在。

3.     @ConditionalOnExpression:判断SpEL表达式是否成立。

4.     @ConditionalOnJava: 指定Java版本是否符合要求。内部有2个属性value和range。value表示一个枚举的Java版本,range表示比这个老或者新于等于指定的Java版本(默认是新于等于)。内部会基于某些jdk版本特有的类去类加载器中查询,比如如果是jdk9,类加载器中需要存在java.security.cert.URICertStoreParameters;如果是jdk8,类加载器中需要存在java.util.function.Function;如果是jdk7,类加载器中需要存在java.nio.file.Files;如果是jdk6,类加载器中需要存在java.util.ServiceLoader。

5.     @ConditionalOnMissingBean:Spring容器中是否缺少对应的实例。可以通过实例的类型、类名、注解、昵称去容器中查找(可以配置从当前容器中查找或者父容器中查找或者两者一起查找)这些属性都是数组,通过"与"的关系进行查找。还多了2个属性ignored(类名)和ignoredType(类名),匹配的过程中会忽略这些bean。

6.     @ConditionalOnMissingClass:跟ConditionalOnClass的处理逻辑一样,只是条件相反,在类加载器中不存在对应的类。

7.     @ConditionalOnNotWebApplication:应用程序是否是非Web程序,没有提供属性,只是一个标识。会从判断Web程序特有的类是否存在,环境是否是Servlet环境,容器是否是Web容器等。

8.     @ConditionalOnProperty:应用环境中的屬性是否存在。提供prefix、name、havingValue以及matchIfMissing属性。prefix表示属性名的前缀,name是属性名,havingValue是具体的属性值,matchIfMissing是个boolean值,如果属性不存在,这个matchIfMissing为true的话,会继续验证下去,否则属性不存在的话直接就相当于匹配不成功。

9.     @ConditionalOnResource:是否存在指定的资源文件。只有一个属性resources,是个String数组。会从类加载器中去查询对应的资源文件是否存在。

10.  @ConditionalOnSingleCandidate:Spring容器中是否存在且只存在一个对应的实例。只有3个属性value、type、search。跟ConditionalOnBean中的这3种属性值意义一样。

11.  @ConditionalOnWebApplication:应用程序是否是Web程序,没有提供属性,只是一个标识。会从判断Web程序特有的类是否存在,环境是否是Servlet环境,容器是否是Web容器等。

下面只做两个注解的测试:

测试注解1:@ConditionalOnBean/@ConditionalOnClass

以下测试同时适用于上述两个注解:

创建两个实体类如下:

spring boot 属性配置 springboot配置类详解_Spring Boot_09

spring boot 属性配置 springboot配置类详解_类名_10

在配置文件中加入配置:

configbean.value1=value1
configbean.value2=value2
configbean.value3=value3
configbean.value4=value4

配Bean:首先测试对ConffigBean1不进行配置初始化

spring boot 属性配置 springboot配置类详解_类加载器_11

测试类:

spring boot 属性配置 springboot配置类详解_Spring Boot_12

启动访问,测试结果:

spring boot 属性配置 springboot配置类详解_类名_13

spring boot 属性配置 springboot配置类详解_类加载器_14

修改代码加入配置ConfigBean1的配置代码:

spring boot 属性配置 springboot配置类详解_类加载器_15

重启后测试,访问结果:

spring boot 属性配置 springboot配置类详解_spring boot 属性配置_16

spring boot 属性配置 springboot配置类详解_spring boot 属性配置_17

 

测试注解2: @ConditionalOnExpression

修改代码:

spring boot 属性配置 springboot配置类详解_Spring Boot_18

在application.properties中加入配置:

configbean.configbean1.configornot=true

configbean.configbean2.configornot=false

注:上配置及注解表明,配置ConfigBean1不进行配置ConfigBean2

启动测试:

spring boot 属性配置 springboot配置类详解_Web_19

spring boot 属性配置 springboot配置类详解_类名_20

 

测试显示configbean1初始化成功,configbean2未进行初始化.

关于条件化配置bean有更复杂,更精确的配置使用方式,在后面章节,<整合mybatis+第三方数据源>中会演示。

 

5. 配置静态资源

 

 

关于SpringBoot静态资源的配置上文4.1.1中已介绍使用配置文件进行配置的方法,但使用配置文件进行配置有个缺点,就是会覆盖默认的静态资源配置,若想保留默认配置可使用如下方式进行配置。

代码如下,不再测试:

spring boot 属性配置 springboot配置类详解_类名_21

 

<实例代码>

Github:https://github.com/chunyuding/SpringBoot-Demo

https://github.com/chunyuding/SpringBoot-Demo.git

码云:https://gitee.com/dingchunyu/SpringBoot-Demo

      https://gitee.com/dingchunyu/SpringBoot-Demo.git

 

<推荐书籍>

 百度云:http://pan.baidu.com/s/1qYA0Nxi