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 {
protected SpringApplicationBuilderconfigure(SpringApplicationBuilder application) {
returnapplication.sources(HelloworldApplication.class);
}
主要是继承SpringBootServletInitializer后重写configure()方法而方法中内容跟jar启动是的main方法一致。
具体可自行研究。
示例如下:
2. 配置首页
在应用中配置应用的首页有多种方式,有一种是在web.xml中配置,使用welcome元素配置首页,在Spring Boot中如何配置,演示如下:
编写代码:
编写简单测试主页:
启动测试:
3. 配置Bean
开发中肯定会有场景需要自定义Bean并加入IOC容器中,可以使用@Component注解,当无法使用注解时可使用如下方法,在类上加入@Configuration,在方法上加入注解@Bean,测试代码如下:创建实体bean
创建配置类,在类上加入注解@Configuration,创建配置方法在方法上加入注解@Bean即可:
测试代码:
启动访问测试:
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
以下测试同时适用于上述两个注解:
创建两个实体类如下:
在配置文件中加入配置:
configbean.value1=value1
configbean.value2=value2
configbean.value3=value3
configbean.value4=value4
配Bean:首先测试对ConffigBean1不进行配置初始化
测试类:
启动访问,测试结果:
修改代码加入配置ConfigBean1的配置代码:
重启后测试,访问结果:
测试注解2: @ConditionalOnExpression
修改代码:
在application.properties中加入配置:
configbean.configbean1.configornot=true
configbean.configbean2.configornot=false
注:上配置及注解表明,配置ConfigBean1不进行配置ConfigBean2
启动测试:
测试显示configbean1初始化成功,configbean2未进行初始化.
关于条件化配置bean有更复杂,更精确的配置使用方式,在后面章节,<整合mybatis+第三方数据源>中会演示。
5. 配置静态资源
关于SpringBoot静态资源的配置上文4.1.1中已介绍使用配置文件进行配置的方法,但使用配置文件进行配置有个缺点,就是会覆盖默认的静态资源配置,若想保留默认配置可使用如下方式进行配置。
代码如下,不再测试:
<实例代码>
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