SpringBoot自动配置 自定义Starter

下面创建一个 spring-boot-starter-hello 的启动器,这个启动器的Person与配置文件的属性绑定,可以供引入这个启动器的项目进行配置。HelloService 使用sayHello方法输出Person内容。HelloAautoConfiguration是配置类,产生HelloService的bean。

项目结构:

SpringBoot自动配置 自定义Starter_第1张图片

首先创建一个SpringBoot项目,pom要做一些修改:

添加如下两个依赖:


   org.springframework.boot
   spring-boot-starter



   org.springframework.boot
   spring-boot-configuration-processor
   true

spring-boot-starter:包含自动配置的基本包,spring-boot-configuration-processor:添加这个依赖会在配置文件产生提示。

pom.xml



	4.0.0
	
		org.springframework.boot
		spring-boot-starter-parent
		1.5.19.RELEASE
		 
	

	cn.cld
	spring-boot-starter-hello
	0.0.1-SNAPSHOT

	
		1.8
	

	
		
			org.springframework.boot
			spring-boot-starter
		

		
			org.springframework.boot
			spring-boot-configuration-processor
			true
		

	


Person.java
package cn.cld;

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

@ConfigurationProperties(prefix = "person")
public class Person {
    private String id="DEFAULT";
    private String name="DEFAULT1";

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}
@ConfigurationProperties(prefix = "person") 把Person类和配置文件绑定。


HelloService.java
package cn.cld;

public class HelloService {
    private Person person;

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    public String sayHello(){
        return "Say : "+this.person;
    }
}
HelloAautoConfiguration.java
package cn.cld;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(Person.class)
@ConditionalOnWebApplication
@ConditionalOnClass(HelloService.class)
@ConditionalOnProperty(prefix = "person",value = {"id","name"},matchIfMissing=true)
public class HelloAautoConfiguration {
    @Autowired
    private Person person;

    @Bean
    @ConditionalOnMissingBean(HelloService.class)
    public HelloService helloService(){
        HelloService hs=new HelloService();
        hs.setPerson(person);
        return hs;
    }

    public int getOrder(){
        return 0;
    }
}
@EnableConfigurationProperties(Person.class) 把与配置文件绑定的Person类导入到容器;
@ConditionalOnWebApplication 只有WEB应用,该配置类才生效;
@ConditionalOnClass(HelloService.class) 只有存在HelloService这个类配置类才生效;
@ConditionalOnProperty(prefix = "person",value = {"id","name"},matchIfMissing=true) 配置中存在person前缀,名称有id有name时候才生效,true说明即使不存在也生效,false不存在报错。
@ConditionalOnMissingBean(HelloService.class)容器里不存在HelloService的bean时候才创建该Bean.

最后:如果这个模块无法被其他模块引用,需要在pom修改


   
      
         org.springframework.boot
         spring-boot-maven-plugin
         
            true
         
      
   

 

最后创建META-INF目录在里面创建如下文件

spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.cld.HelloAautoConfiguration

最后,其他SpringBoot项目引入这个自定义启动器,就可以注入HelloService进行sayHello调用,并可以在配置文件里配置person的值。

你可能感兴趣的:(springcloud)