SpringBoot——自定义自动配置与起步依赖
SpringBoot为我们提供了灵活强大的自动配置与起步依赖功能,接下来我们参考其实现原理,实现专属于我们自己的自动配置与起步依赖。
不仅如此,我们对其稍作修改,让它适用于非SpringBoot环境,甚至是低版本的Spring Framework环境
1自动配置
在编写自己的自动配置之前,我们先来看一下SpringBoot自动配置类的实现原理。
SpringBoot可以根据CLASSPATH、配置项等条件自动进行常规配置,省去了我们自己手动把一模一样的配置复制来复制去的麻烦。这样大大提升了开发效率!
在这之前,我们已经看到过@SpringBootApplication注解了,查看这个注解,可以发现它上面添加了一个@EnableAutoConfiguration,基于这个注解就可以开启自动配置功能。
这两个注解上都有exclude属性,我们可以在其中排除一些不想启用的自动配置类。
如果不想启用自动配置功能,也可以在配置文件中配置spring.boot.enableautoconfiguration=false,关闭该功能。
1.1自动配置的实现原理
自动配置类其实就是添加了@Configuration的普通Java配置类,它利用Spring Framework 4.0加入的条件注解@Conditional来实现“根据特定条件启用相关配置类”,注解中传入的Condition类就是不同条件的判断逻辑。SpringBoot内置了很多条件注解,如下表所示:
条件注解 | 生效条件 |
---|---|
@ConditionalOnBean | 存在特定名称、特定类型、特定泛型参数或带有特定注解的Bean |
@ConditionalOnMissingBean | 与前者相反,不存在特定的Bean |
@ConditionalOnClass | 存在特定的类 |
@ConditionalOnMissingClass | 与前者相反,不存在特定类 |
@ConditionalOnCloudPlatform | 运行在特定的云平台上,截止2.6.3版本,代表云平台的枚举类支持无云平台,可以通过spring.main.cloud-platform配置强制使用的云平台 |
@ConditionalOnExpression | 指定的SpEL表达式为真 |
@ConditionalOnJava | 运行在满足条件的Java上,可以比指定版本新,也可以比指定版本旧 |
@ConditionalOnJndi | 指定的JNDI位置必须存在一个,如没有指定,则需要存在InitalContext |
@ConditionalOnProperty | 属性值满足特定条件,比如给定的属性值都不能为false |
@ConditionalOnResource | 存在特定资源 |
@ConditionalOnSingleCandidate | 当前上下文中,特定类型的Bean有且仅有一个 |
@ConditionalOnWarDeployment | 应用程序是通过传统的War方式部署的,而非内嵌容器 |
@ConditionalOnWebApplication | 应用程序是一个Web应用程序 |
@ConditionalOnNotWebApplication | 与前者相反,应用程序不是一个Web应用程序 |