preload-image

springboot 新建 AutoConfiguration

比如现在有一个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') } 

Back-To-Top