`

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所写)

 

 

本文转自:http://elim.iteye.com/blog/2432933

分享到:
评论

相关推荐

    Spring Boot消息传递:自动配置的魔法

    2. **自动配置**:Spring Boot根据项目中添加的依赖自动配置Spring应用程序,减少手动配置的需要。 3. **独立运行**:Spring Boot应用程序包含内嵌的HTTP服务器(如Tomcat、Jetty或Undertow),可以打包成一个独立的...

    LEARNING SPRING BOOT 3.0 - THIRD EDITION

    《Learning Spring Boot 3.0 - 第三版》是...书中还会深入讨论Spring Boot的核心特性,比如自动配置、健康检查、内嵌的Tomcat或Jetty服务器、Spring MVC用于构建RESTful API,以及数据访问层的集成,包括JPA和Hibernat

    Spring Boot讲义.pdf

    Spring Boot通过`@EnableAutoConfiguration`注解来启用自动配置功能,它利用类路径中的jar包依赖,根据添加的jar依赖猜测如何配置Spring。根据项目的类路径上的jar依赖,Spring Boot会自动配置应用程序。 #### 2.5....

    spring boot资料以及项目

    Spring Boot的核心理念是“约定优于配置”,它通过默认配置和自动配置,使得开发者可以快速搭建一个可运行的应用。它内置了Tomcat服务器,支持Java或Groovy编写应用,并且提供了大量的起步依赖(Starters),如数据...

    Spring Boot整合Spring Batch,实现批处理

    通过自动配置和“起步依赖”(Starter Dependency),Spring Boot使得创建独立的、生产级别的Java应用变得简单。对于批处理场景,Spring Boot可以轻松配置数据库连接、日志记录、应用监控等基础设施。 其次,**...

    spring-boot-2.7.0.zip源码

    2. **自动配置**:Spring Boot的自动配置是通过`@EnableAutoConfiguration`注解实现的。源码中,每个自动配置类都位于`spring-boot-autoconfigure`模块下,它们根据应用的依赖来决定是否激活相应的配置。例如,如果...

    十分钟上手spring boot

    - 启用Spring Boot的自动配置功能。 - **11.3.3. main方法** - 编写main方法来启动Spring Boot应用。 - **11.4. 运行示例** - 通过IDE或者命令行来运行Spring Boot应用。 - **11.5. 创建一个可执行jar** - 将...

    Spring-Boot-Reference-Guide, Spring Boot Reference Guide中文翻译 -《Spring Boot参考指南》.zip

    《Spring Boot参考指南》是Spring Boot开发者的重要参考资料,它详细阐述了Spring Boot框架的核心特性、配置方式、自动配置原理以及如何构建微服务应用等关键知识点。Spring Boot是Java开发领域中一个极其流行的轻量...

    使用 Spring Boot 快速构建 Spring 框架应用

    在自动配置方面,Spring Boot 根据项目依赖自动配置 Spring 组件。例如,如果项目包含了 Spring Data JPA 相关的依赖,Spring Boot 就会自动配置数据库连接和数据访问层。这样,开发者无需编写大量 XML 配置文件或...

    Spring Boot实战派(源码)

    - 自动配置:Spring Boot会根据项目依赖自动配置相应的bean,如数据源、Web服务器等。 2. **起步依赖(Starter POMs)** - Spring Boot通过一系列的起步依赖来简化Maven或Gradle配置,比如`spring-boot-starter-...

    【Spring Boot启航】深度解析Starter自动配置的奥秘

    1. **自动配置**:Spring Boot可以自动配置Spring应用程序,简化了配置流程。 2. **独立运行**:Spring Boot应用程序包含内嵌的HTTP服务器(如Tomcat、Jetty或Undertow),可以打包成一个独立的JAR文件,通过简单的`...

    Spring Boot in Action 英文版

    Spring Boot的两个核心特性是自动配置和起步依赖。自动配置可以自动配置项目中可能用到的组件,而起步依赖则能够简化项目构建配置。 Spring Boot通过引入"starter POMs"来简化项目配置。"starter POMs"是一组方便的...

    Spring Boot揭秘 PDF

    1. 自动配置:Spring Boot通过`@EnableAutoConfiguration`注解来自动配置应用,它会根据项目中的依赖来决定哪些组件应该被自动配置。例如,如果项目中包含了`spring-boot-starter-web`起步依赖,那么Spring Boot将...

    Spring Boot 进阶笔记(详细全面) 中文PDF完整版.pdf

    1. **自动配置**:Spring Boot 根据项目中包含的依赖自动生成相应的配置,例如,引入 `spring-boot-starter-web` 会自动配置 Spring MVC 和 Tomcat 服务器。 2. **起步依赖(Starter POMs)**:Spring Boot 提供了一...

    Spring Boot-实战

    自动配置是Spring Boot的一大亮点,它基于“约定优于配置”的原则,通过“spring-boot-starter”模块来引入特定功能的依赖,并默认配置好大部分设置,极大地减少了手动配置的工作量。 书中可能会涵盖以下内容: 1....

    Spring Boot参考指南(2.0.1)中文版.pdf

    1. 自动配置:Spring Boot 提供了自动配置功能,可以根据依赖关系自动配置应用程序。 2. Starter 依赖关系:Spring Boot 提供了一些 starter 依赖关系,例如 Web、JPA、Security 等,可以快速构建应用程序。 3. 生产...

    Spring Boot 2 Cookbook 第二版

    Spring Boot是Spring框架的一个子项目,旨在简化Java应用程序的初始搭建以及开发过程,通过提供预配置的特性,如嵌入式Web服务器、自动配置、起步依赖等,极大地提高了开发效率。 本书首先会讲解Spring Boot 2的...

    spring boot 相关技术

    2. **Spring Boot 自动配置**:解释 Spring Boot 如何通过 @EnableAutoConfiguration 注解进行自动配置,以及如何自定义自动配置。 3. **Web 开发**:讲解如何使用 Spring Boot 开发 Web 应用,包括 RESTful API 和...

    最新Spring Boot Admin 官方参考指南-中文版-2.x

    这可以通过引入`spring-boot-admin-starter-client`依赖来实现,或者如果你正在使用Spring Cloud Discovery,你的应用程序会自动被Spring Boot Admin Server发现。此外,SBA还支持静态配置选项,以便手动管理应用...

    Spring Boot Tutorial 《Spring Boot 教程》

    3. **自动配置(Auto-configuration)**:Spring Boot通过条件注解来自动配置应用,比如`@EnableAutoConfiguration`。当发现特定的类或库在类路径中时,它会自动配置相关的bean。 4. **Spring Application**:`...

Global site tag (gtag.js) - Google Analytics