`
234390216
  • 浏览: 10196412 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:460982
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1772061
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1395705
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:393983
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:678335
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:529401
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1178940
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:462427
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:150257
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:66953
社区版块
存档分类
最新评论

Spring Boot(04)创建自己的自动配置

阅读更多

创建自己的自动配置

当你的应用需要以jar包的形式提供给其它应用使用时,可以考虑把它们封装为一个Spring Boot Starter。即该jar包是可以自动添加需要引用的依赖项,也能够对核心功能进行自动配置。自动配置的核心类是一个标注了@Configuration的类,然后在自动配置类中可以定义相应的bean。比如下面的配置类中定义了一个HelloBean类型的bean。

@Configuration
public class HelloAutoConfiguration {

    @Bean
    public HelloBean helloBean() {
        return new HelloBean();
    }
    
}

然后需要在Classpath下的META-INF/spring.factories中以org.springframework.boot.autoconfigure.EnableAutoConfiguration为Key,以对应的自动配置类为Value进行配置,如果有多个自动配置类,多个自动配置类之间可以以英文逗号分隔。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.elim.autoconfigure.HelloAutoConfiguration

Spring Boot在启动时将读取Classpath下META-INF/spring.factories中Key为org.springframework.boot.autoconfigure.EnableAutoConfiguration的配置类,将它们进行实例化。所以经过上述配置后,系统启动后将自动创建HelloBean类型的bean。

自动配置类通常不会像上面那样直接进行定义,而是会添加一些附加条件,比如在Classpath中拥有某些Class才生效,或者需要bean容器中不存在指定bean时才生效等等。Spring Boot为它们提供了一系列的@ConditionalXXX,常用的如下:

  • ConditionalOnClass :用于指定在Classpath下拥有某些Class时才生效
  • ConditionalOnMissingClass :用于指定在Classpath下不存在某些Class时才生效
  • ConditionalOnBean :用于指定在bean容器中存在某些bean时生效
  • ConditionalOnMissingBean :用于指定在bean容器中不存在某些bean时生效
  • ConditionalOnWebApplication :用于指定当应用是Web应用时生效
  • ConditionalOnNotWebApplication :用于指定当应用是非Web应用时生效
  • ConditionalOnProperty :用于指定当配置了某些特定的参数时生效
  • ConditionalOnExpression :用于根据SpEl表达式控制是否生效
  • ConditionalOnSingleCandidate :用于指定当bean容器中只存在唯一的指定类型的bean时才生效;当bean容器中存在多个指定类型的bean,但是使用@Primary指定了主候选者也是可以匹配的,即也是生效的

更多可用的Conditional注解可以参考API文档的org.springframework.boot.autoconfigure.condition包。

下面的代码中指定了当Classpath下存在Hello.class,且bean容器中不存在HelloBean类型的bean时下面的配置类将生效。

@Configuration
@ConditionalOnClass(Hello.class)
@ConditionalOnMissingBean(HelloBean.class)
public class HelloAutoConfiguration {

    @Bean
    public HelloBean helloBean() {
        return new HelloBean();
    }
    
}

这些条件配置注解也是可以添加到bean上的。比如下面代码中指定了当Environment中存在Key为autoconfigure.hello.enabled属性且其值为true时将创建HelloBean类型的bean,或者当Environment中不存在Key为autoconfigure.hello.enabled属性时也将创建HelloBean类型的bean(由matchIfMissing控制)。所以针对下面的配置,默认情况下是会创建HelloBean类型的bean的,如果不期望创建该类型的bean,可以在application.properties文件中指定autoconfigure.hello.enabled=false

@Configuration
@ConditionalOnClass(Hello.class)
@ConditionalOnMissingBean(HelloBean.class)
public class HelloAutoConfiguration {

    @Bean
    @ConditionalOnProperty(prefix = "autoconfigure.hello", name = "enabled", havingValue = "true", matchIfMissing = true)
    public HelloBean helloBean() {
        return new HelloBean();
    }

}

当使用@ConditionalOnProperty时如果对应的值的可选值是true/false,可以不指定havingValue属性,此时只要值不为false,都会认为是true。

绑定参数

通常自定义的Starter会需要依靠外部配置的属性进行一些自动配置。此时可以使用@ConfigurationProperties标注在用来接收属性的Class上,它可以指定一个前缀,然后将在application.properties中寻找指定前缀和字段名称组合起来的属性进行绑定。比如下面的属性类中的name属性将绑定application.properties中定义的autoconfigure.hello.name属性的值。

@Data
@ConfigurationProperties("autoconfigure.hello")
public class HelloProperties {

    private String name;
    
    private String message;
    
}

@ConfigurationProperties标注的Class需要通过在配置类上使用@EnableConfigurationProperties进行启用。@EnableConfigurationProperties指定的配置类会自动注册为Spring bean容器中的一个bean,然后可以在配置类中自动注入对应的属性类。比如下面的代码中在HelloAutoConfiguration类上通过@EnableConfigurationProperties(HelloProperties.class)指定了启用HelloProperties这个属性配置类,然后把它定义为HelloAutoConfiguration类中的一个属性,并标注为自动注入,然后在定义HelloBean类型的bean时从HelloProperties中获取属性值进行配置。

@Configuration
@ConditionalOnClass(Hello.class)
@ConditionalOnMissingBean(HelloBean.class)
@EnableConfigurationProperties(HelloProperties.class)
public class HelloAutoConfiguration {

    @Autowired
    private HelloProperties helloProperties;
    
    @Bean
    @ConditionalOnProperty(prefix = "autoconfigure.hello", name = "enabled", matchIfMissing = true)
    public HelloBean helloBean() {
        HelloBean helloBean = new HelloBean();
        helloBean.setName(helloProperties.getName());
        return helloBean;
    }

}

上面的代码中定义HelloBean时从HelloProperties中获取name属性赋值给了HelloBean对象的name属性。这样的需求其实可以直接通过@ConfigurationProperties给HelloBean的name属性赋值,而不必添加多余的HelloProperties类。把@ConfigurationProperties定义在HelloBean定义的方法上可以拥有相同的效果,比如下面这样。

@Configuration
@ConditionalOnClass(Hello.class)
@ConditionalOnMissingBean(HelloBean.class)
public class HelloAutoConfiguration {

    @Bean
    @ConditionalOnProperty(prefix = "autoconfigure.hello", name = "enabled", matchIfMissing = true)
    @ConfigurationProperties("autoconfigure.hello")
    public HelloBean helloBean() {
        return new HelloBean();
    }

}

使用@ConfigurationProperties定义属性配置类时最好定义的前缀不要以spring开头,以免跟未来Spring官方提供的属性配置类存在冲突。

自定义的Starter在命名时不要命名为spring-boot-starter-xxx,可以命名为xxx-spring-boot-starterspring-boot-starter-xxx留给官方使用。

参考文档

https://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/html/boot-features-developing-auto-configuration.html

(注:本文基于Spring Boot 2.0.3所写)

0
0
分享到:
评论

相关推荐

    Spring cloud和Spring boot介绍

    Spring Boot简化了基于Spring的应用开发,通过少量的代码就能...Spring Boot的核心思想就是约定大于配置,一切自动完成。采用Spring Boot可以大大的简化你的开发模式,所有你想集成的常用框架,它都有对应的组件支持。

    Spring Boot 2.0培训.pdf

    尽可能地自动配置Spring; • 提供生产就绪型功能,如指标、健康检查和外部配置; . 绝对没有代码生成,对XML 没有要求配置。 这段描述告诉我们,首先Spring Boot 是一个基于Spring 框架搭建起来的应用,其次它会...

    Spring Boot应用开发框架项目旨在简化创建产品级的Spring应用和服务.rar

    自动配置:根据项目的依赖关系,自动为应用程序配置合适的默认配置。 内嵌服务器:直接运行应用程序,无需部署到外部应用服务器。 起步依赖:通过Maven或Gradle的依赖管理系统,简化项目依赖的添加和管理。 Actuator...

    spring-boot示例项目

    Spring Boot简化了基于Spring的应用开发,通过少量的代码就能创建一个独立的、产品级别的Spring应用。 Spring Boot为Spring平台及第三方库提供开箱即用的设置,这样你就可以有条不紊地开始。多数Spring Boot应用只...

    spring boot实战.pdf高清无水印

    3.1 覆盖Spring Boot自动配置 42 3.1.1 保护应用程序 43 3.1.2 创建自定义的安全配置 44 3.1.3 掀开自动配置的神 秘面纱 48 3.2 通过属性文件外置配置 49 3.2.1 自动配置微调 50 3.2.2 应用程序Bean的...

    Spring Boot实战 ,丁雪丰 (译者) 中文版

    3.1 覆盖Spring Boot自动配置 42 3.1.1 保护应用程序 43 3.1.2 创建自定义的安全配置 44 3.1.3 掀开自动配置的神秘面纱 48 3.2 通过属性文件外置配置 49 3.2.1 自动配置微调 50 3.2.2 应用程序...

    49道Spring Boot面试题带答案(很全)

    自动化配置:Spring Boot提供了一系列的默认配置,这些配置可以满足大多数应用程序的需求。开发人员可以通过简单的注解或XML配置来覆盖这些默认配置,而不需要手动编写大量的配置代码。 创建独立的应用程序:Spring ...

    Intellij IDEA 搭建Spring Boot项目教程.docx

    教程通过详细的步骤和屏幕截图,引导开发者正确安装和配置IntelliJ IDEA,以便无缝地开始创建Spring Boot项目。在安装完成后,教程逐步指导读者创建新的Spring Boot项目,包括选择项目类型、添加依赖、配置项目结构...

    Spring Boot学习资料教程.docx

    本教程为笔者学习 Spring Boot 时写的笔记,适合没有接触过此框架的新手。...Spring MVC自动配置扩展 Spring MVC 错误处理机制定制错误页面 Servlet容器 三大组件介绍修改容器 Docker 数据访问 ...

    Spring Boot中文文档.rar

    28.2.1.Spring WebFlux自动配置 28.2.2.带有HttpMessageReaders和HttpMessageWriters的HTTP编解码器 28.2.3.静态内容 28.2.4.模板引擎 28.2.5.错误处理 自定义错误页面 28.2.6.网络过滤器 28.3...

    wro4j-spring-boot-starter:Spring Boot启动器和wro4j的自动配置(http:alexo.github.iowro4j)

    Spring Boot启动程序和wro4j的自动配置: 是用于分析和优化Web资源的工具。 它汇集了几乎所有现代Web工具:JsHint,CssLint,JsMin,Google Closure压缩器,YUI Compressor,UglifyJs,Dojo Shrinksafe,Css变量...

    spring-boot-resteasy:RESTEasy 的 Spring Boot 自动配置

    现在创建一个启用自动配置和组件扫描的 Spring Boot 应用程序: import org.springframework.boot.SpringApplication ;import org.springframework.boot.autoconfigure.EnableAutoConfiguration ;import org.spring...

    spring-boot-starter-quartz:Quartz-Scheduler的Spring-Boot自动配置

    Quartz Scheduler的Spring-Boot自动配置只是Quartz Scheduler的Spring-Boot启动器。 当然,Quartz Scheduler已经有好几个启动器,但是它们都不能满足我的所有需求,因此我创建了自己的启动器。 这只是一个业余项目。...

    springboot知识点整理

    1.6 使用Spring Initializer向导快速创建Spring Boot 16 2 Spring Boot配置 18 2.1 配置文件 18 2.2 YML语法 19 2.3 YML配置文件值获取 21 2.4 properties配置文件乱码问题 24 2.5 @ConfigurationProperties与@Value...

    spring boot java接口自动化测试工具源码

    完整spring boot 接口自动化测试工具开发源码,包含前端vue代码;实现大部分接口测试场景;安装依赖、配置mysql数据,附带创建表sql脚本; sprint boot + mybatis + mysql。 实现多线程执行,支持数据缓存; 如有疑问...

    SpringBoot实战(第4版)清晰版

    1 自动配置微调 50 3 . 2 . 2 应用程序 Bean 的配置外置 55 3 . 2 . 3 使用 Profilc 进行配呈 59 3 . 3 定制应用程序错误页面 62 3 . 4 小结 64 第 4 章测试 “ 4 . 1 集成测试自动配置 “ 4 . 2 测试 Web 应用程序...

    通过Java配置实现的Spring Boot中大量的自动化配置.docx

    创建一个普通的 Maven工程(注意,这里可以不必创建Web工程),并添加SpringMVC的依赖,同时,这里环境的搭建需要用到 Servlet ,所以我们还需要引入 Servlet 的依赖(一定不能使用低版本的Servlet),最终的 pom....

    resteasy-spring-boot:RESTEasy Spring Boot Starter

    那里没有RESTEasy Spring Boot启动程序,因此PayPal团队决定创建一个启动程序并与社区共享。 该Spring Boot启动器具有完整的功能,上面具有ZERO PayPal特定的代码,并且可以由希望具有REST端点并更喜欢RESTEasy...

    spring-boot-starter-web.jar

    使用SpringMVC构建web(包括RESTful)应用程序的初学者。...spring-boot-starter-web 为我们提供了嵌入的 Servlet 容器以及 SpringMVC 的依赖,并为 Spring MVC 提供了大量自动配置,可以适用于大多数 Web 开发场景。

Global site tag (gtag.js) - Google Analytics