springboot 新建 AutoConfiguration

2023年2月14日07:59:59

比如现在有一个User类型,那么我们想实现的功能是,如果存在User.class这个类,就自动创建一个类型为User的Bean

UserProperties.java

package org.springframework.boot.autoconfigure.api;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "spring.user")
public class UserProperties {
    private String username = "wuhulala";
    private String phone = "15748451556";
    private String email = "wuhulala@gmail.com";

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
package org.springframework.boot.autoconfigure.api;

import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

/**
 * 功能说明: com.wuhulala.springboot.autoconfiguration.condition<br>
 * 注意事项: <br>
 * 系统版本: v1.0<br>
 * 开发人员: wuhulala<br>
 * 开发时间: 2018/4/6<br>
 */
public class UserApiCondition extends SpringBootCondition{
    @Override
    public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
        boolean enable = context.getEnvironment().getProperty("user.enable", Boolean.class);
        System.out.println(enable);
        return new ConditionOutcome(enable, "用户开关开启状态:" + enable);
    }
}

新建一个Configuration,并且设置条件为User.Class

WuhulalaApiAutoConfiguration.java

package org.springframework.boot.autoconfigure.api;

import com.wuhulala.api.model.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 功能说明: org.springframework.boot.autoconfigure.api<br>
 * 注意事项: <br>
 * 系统版本: v1.0<br>
 * 开发人员: wuhulala<br>
 * 开发时间: 2018/4/6<br>
 */
@Configuration
@ConditionalOnClass(User.class)
@EnableConfigurationProperties(UserProperties.class)
public class WuhulalaApiAutoConfiguration {

    private final UserProperties properties;

    public WuhulalaApiAutoConfiguration(UserProperties properties) {
        this.properties = properties;
    }

    @Bean
    @Conditional(UserApiCondition.class)
    public User owner(){
        String name = properties.getUsername();
        String phone = properties.getPhone();
        String mail = properties.getEmail();
        User user = new User(name, mail, phone);
        System.out.println(user);
        return user;
    }
}

注册AutoConfiguration

spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.api.WuhulalaApiAutoConfiguration

对应修改元数据定义
META-INF/additional-spring-configuration-metadata.json

{
  "hints": [],
  "groups": [
    {
      "sourceType": "org.springframework.boot.autoconfigure.api.UserProperties",
      "name": "spring.user",
      "type": "org.springframework.boot.autoconfigure.api.UserProperties"
    }
  ],
  "properties": [
    {
      "name": "spring.user.username",
      "type": "java.lang.String",
      "defaultValue": "wuhulala",
      "description": "Description for spring.user.name."
    },
    {
      "name": "spring.user.email",
      "type": "java.lang.String",
      "defaultValue": "wuhulala@gmail.com",
      "description": "Description for spring.user.name."
    },
    {
      "name": "spring.user.phone",
      "type": "java.lang.String",
      "defaultValue": "15784855564",
      "description": "Description for spring.user.name."
    }
  ]
}

gradle 配置org.springframework.boot:spring-boot-configuration-processor用于生成元数据约束文件

compileJava.dependsOn(processResources)

dependencies {
    compile('com.wuhulala:api:1.0-SNAPSHOT@jar')
    compile('org.springframework.boot:spring-boot-starter')
    compile('org.springframework.boot:spring-boot-starter-web'){
        exclude module: 'org.springframework.boot:spring-boot-starter-tomcat'
    }
    compileOnly ("org.springframework.boot:spring-boot-configuration-processor")

    compile('org.springframework.boot:spring-boot-starter-jetty')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

  • 作者:wuhulala
  • 原文链接:https://wuhulala.blog.csdn.net/article/details/87650624
    更新时间:2023年2月14日07:59:59 ,共 3847 字。