springboot1.2.5根据配置文件动态创建Bean

package com.test.ratelimiter.config;

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

import java.util.Map;

@Configuration
@ConfigurationProperties(prefix = "rateLimiter2")
public class RateLimiterConfigBeanProperties {
    private Map<String, Object> rateLimiters;

    public Map<String, Object> getRateLimiters() {
        return rateLimiters;
    }

    public void setRateLimiters(Map<String, Object> rateLimiters) {
        this.rateLimiters = rateLimiters;
    }
}

 

package com.test.ratelimiter.config;

public class RateLimiterConfig {
    //单位时间内分隔的小窗口数量
    private int slot = 20;
    //单位时间内限流数量
    private long limit = 30;
    //单位时间s
    private int time = 1;

    public int getSlot() {
        return slot;
    }

    public void setSlot(int slot) {
        this.slot = slot;
    }

    public long getLimit() {
        return limit;
    }

    public void setLimit(long limit) {
        this.limit = limit;
    }

    public int getTime() {
        return time;
    }

    public void setTime(int time) {
        this.time = time;
    }
}

 

 

package com.test.ratelimiter.config;

import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.boot.bind.RelaxedDataBinder;
import org.springframework.boot.bind.RelaxedPropertyResolver;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotationMetadata;
import java.util.Map;
import java.util.Objects;

@Configuration
@EnableConfigurationProperties(RateLimiterConfigBeanProperties.class)
@Import(DynamicRateLimiterConfig.ImportConfig.class)
public class DynamicRateLimiterConfig {
    public static class ImportConfig implements ImportBeanDefinitionRegistrar, EnvironmentAware {
        private RateLimiterConfigBeanProperties beanProperties;

        @Override
        public void setEnvironment(Environment environment) {
            try {
                RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(environment);
                Map<String, Object> properties = resolver.getSubProperties("");
                beanProperties = RateLimiterConfigBeanProperties.class.newInstance();
                RelaxedDataBinder binder = new RelaxedDataBinder(beanProperties, getPropertiesPrefix(RateLimiterConfigBeanProperties.class));
                binder.bind(new MutablePropertyValues(properties));
            }catch (Exception ex) {
                ex.printStackTrace();
            }
        }

        private String getPropertiesPrefix(Class<?> tClass) {
            return Objects.requireNonNull(AnnotationUtils.getAnnotation(tClass, ConfigurationProperties.class)).prefix();
        }

        @Override
        public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
            Map<String, Object> mapping = beanProperties.getRateLimiters();
            for (Map.Entry<String, Object> entry : beanProperties.getRateLimiters().entrySet()) {
                Map<String, Integer> config = (Map<String, Integer>) entry.getValue();
                // 注册bean
                RootBeanDefinition beanDefinition = new RootBeanDefinition();
                beanDefinition.setBeanClass(RateLimiterConfig.class);
                MutablePropertyValues values = new MutablePropertyValues();
                values.addPropertyValue("slot", config.get("slot"));
                values.addPropertyValue("limit", config.get("limit"));
                values.addPropertyValue("time", config.get("time"));
                beanDefinition.setPropertyValues(values);
                registry.registerBeanDefinition(entry.getKey(), beanDefinition);
            }
        }
    }
}

 配置文件:

rateLimiter2:
    rateLimiters:
      #slot单位时间内分隔的小窗口数量,limit单位时间内限流数量,time单位时间s
      annualRpt:
        slot: 20
        limit: 30
        time: 1
      wxSportSummaryRpt:
        slot: 20
        limit: 30
        time: 1
      lockerRemainQuery:
        slot: 20
        limit: 10
        time: 1

 

posted on 2023-06-27 18:47  jmbkeyes  阅读(430)  评论(0)    收藏  举报

导航