`

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),可以打包成一个独立的...

    Spring Boot讲义.pdf

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

    spring boot资料以及项目

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

    LEARNING SPRING BOOT 3.0 - THIRD EDITION

    读者将深入了解自动配置是如何工作的,以及Spring Boot如何根据应用所包含的依赖自动配置底层基础设施。健康检查功能也是Spring Boot的亮点,它可以帮助开发者和运维人员监测应用的状态和性能,及时发现并解决潜在...

    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揭秘 PDF

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

    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-实战

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

    Spring Boot 2 Cookbook 第二版

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

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

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

    最新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**:`...

    spring-boot-中文参考手册

    自动配置是Spring Boot的一大亮点,它根据项目中的类路径和已添加的jar依赖,自动配置相应的Bean。例如,如果在类路径下发现`HSQLDB`,那么Spring Boot会自动配置一个内存数据库;如果发现了`@Controller`注解的类,...

    spring-boot-reference

    整体上,Spring Boot Reference Guide对Spring Boot的各个方面提供了深入的指导,包括但不限于Spring Boot的安装和配置、构建系统、代码结构、自动配置、Spring Beans管理、依赖注入和应用的运行。对于初学者来说,...

Global site tag (gtag.js) - Google Analytics