springboot自定义自配置类

springboot自定义自配置类

需求:当某个类存在的时候,自动配置这个类的bean,并可将bean的属性在application.properties中配置

1、导包

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-autoconfigure -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
    <version>2.3.4.RELEASE</version>
</dependency>

2、自定义start的配置文件(仿照HttpProperties)

package com.yl.properties;

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

@ConfigurationProperties(prefix = "my.properties")//将配置文件中指定前缀(my.properties)的值映射到当前类
public class MyProperties {
    private MyProperties.Properties properties=new MyProperties.Properties();

    public MyProperties() {
    }

    public Properties getProperties() {
        return properties;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    public static class Properties{
        public static final String DEFAULT_NAME;//默认值,也可以在配置文件自定义值
        private String name;
        private String age;

        static {
            DEFAULT_NAME="yl";
        }

        public String getName() {
            return name;
        }

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

        public String getAge() {
            return age;
        }

        public void setAge(String age) {
            this.age = age;
        }

    }
}

3、配置文件注入属性值

my:
  properties:
    properties:
      age: 18
      name: yl

4、判断依据类

对应需求中的某个类,作为判断依据类,如果存在则创建这个类的bean

package com.yl.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class MyClass {
    private String name;
    private String age;
}

4、自动配置类

package com.yl.configration;

import com.yl.bean.MyClass;
import com.yl.properties.MyProperties;
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.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(MyProperties.class)//使@ConfigurationProperties注解的类生效。
@ConditionalOnClass(MyClass.class)//当前类路径下有指定类(MyClass)的条件下启动自配置
//指定的属性是否有指定的值,当matchIfMissing为true时,配置文件缺少value或name对应的属性值也会注入成功
@ConditionalOnProperty(prefix = "my.properties",value = "enabled",matchIfMissing = true)
public class MyAutoConfigration {
    private MyProperties.Properties properties;

    public MyAutoConfigration(MyProperties properties) {
        this.properties = properties.getProperties();
    }

    @Bean
    @ConditionalOnMissingBean(MyClass.class)//当容器里没有指定bean(MyClass)时配置bean
    public MyClass person(){
        MyClass myClass =new MyClass();
        myClass.setName(properties.getName());
        myClass.setAge(properties.getAge());

        return myClass;
    }
}

5、注册自动配置类

在resource下创建META-INF文件夹,在此文件夹下创建spring.factories文件

org.springframework.boot.autoconfigure.EnableAutoConfiguration=
com.yl.configration.MyAutoConfigration  # 自动配置类全限定类名

6、测试

package com.yl.controller;

import com.yl.bean.MyClass;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class TestController {
    @Autowired
    private MyClass myClass;

    @RequestMapping("/testAutoConfigration")
    @ResponseBody
    public MyClass testAutoConfigration(){
        return myClass;
    }

}

参考资料:https://segmentfault.com/a/1190000020264520?utm_source=tag-newest

记得快乐
原文地址:https://www.cnblogs.com/Y-wee/p/14038166.html