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
浙公网安备 33010602011771号