SpringBoot2动态@Value怎么实现
本篇内容介绍了“SpringBoot2动态@Value怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:空间域名、虚拟主机、营销软件、网站建设、射阳网站维护、网站推广。
具体的实现步骤分为如下几步
1.通过BeanPostProcessor取得有使用@Value注解的bean,并存储到map中
2.动态修改map中的bean字段的值
获取bean
首先写一个类实现BeanPostProcessor接口,只需要使用其中的一个函数就可以。前后都可以用来实现,并不影响最终的使用,因为咱们只是需要bean的实例。
接下来看一下具体实现代码
package com.allen.apollo; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.context.annotation.Configuration; import org.springframework.util.ReflectionUtils; import java.lang.reflect.Field; import java.util.LinkedList; import java.util.List; import java.util.Set; @Configuration public class SpringValueProcessor implements BeanPostProcessor { private final PlaceholderHelper placeholderHelper = new PlaceholderHelper(); @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (beanName.equals("springValueController")) { Class obj = bean.getClass(); Listfields = findAllField(obj); for (Field field : fields) { Value value = field.getAnnotation(Value.class); if (value != null) { Set keys = placeholderHelper.extractPlaceholderKeys(value.value()); for (String key : keys) { SpringValue springValue = new SpringValue(key, value.value(), bean, beanName, field, false); SpringValueCacheMap.map.put(key, springValue); } } } } return bean; } private List findAllField(Class clazz) { final List res = new LinkedList<>(); ReflectionUtils.doWithFields(clazz, new ReflectionUtils.FieldCallback() { @Override public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException { res.add(field); } }); return res; } }
上面的代码咱们就已经拿到了SpringValueController这个实例bean并存储到了map当中,下面看一下测试代码
/** * cache field,存储bean 字段 */ package com.allen.apollo; import com.google.common.collect.LinkedListMultimap; import com.google.common.collect.Multimap; public class SpringValueCacheMap { public static final Multimapmap = LinkedListMultimap.create(); }
package com.allen.apollo; import java.lang.ref.WeakReference; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Type; import org.springframework.core.MethodParameter; public class SpringValue { private MethodParameter methodParameter; private Field field; private WeakReference
package com.allen.apollo; import com.google.common.base.Strings; import com.google.common.collect.Sets; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanExpressionContext; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.config.Scope; import org.springframework.util.StringUtils; import java.util.Set; import java.util.Stack; /** * Placeholder helper functions. */ public class PlaceholderHelper { private static final String PLACEHOLDER_PREFIX = "${"; private static final String PLACEHOLDER_SUFFIX = "}"; private static final String VALUE_SEPARATOR = ":"; private static final String SIMPLE_PLACEHOLDER_PREFIX = "{"; private static final String EXPRESSION_PREFIX = "#{"; private static final String EXPRESSION_SUFFIX = "}"; /** * Resolve placeholder property values, e.g. *
*
* "${somePropertyValue}" -> "the actual property value" */ public Object resolvePropertyValue(ConfigurableBeanFactory beanFactory, String beanName, String placeholder) { // resolve string value String strVal = beanFactory.resolveEmbeddedValue(placeholder); BeanDefinition bd = (beanFactory.containsBean(beanName) ? beanFactory .getMergedBeanDefinition(beanName) : null); // resolve expressions like "#{systemProperties.myProp}" return evaluateBeanDefinitionString(beanFactory, strVal, bd); } private Object evaluateBeanDefinitionString(ConfigurableBeanFactory beanFactory, String value, BeanDefinition beanDefinition) { if (beanFactory.getBeanExpressionResolver() == null) { return value; } Scope scope = (beanDefinition != null ? beanFactory .getRegisteredScope(beanDefinition.getScope()) : null); return beanFactory.getBeanExpressionResolver() .evaluate(value, new BeanExpressionContext(beanFactory, scope)); } /** * Extract keys from placeholder, e.g. *
-
*
- ${some.key} => "some.key" *
- ${some.key:${some.other.key:100}} => "some.key", "some.other.key" *
- ${${some.key}} => "some.key" *
- ${${some.key:other.key}} => "some.key" *
- ${${some.key}:${another.key}} => "some.key", "another.key" *
- #{new java.text.SimpleDateFormat("${some.key}").parse("${another.key}")} => "some.key", "another.key" *
package com.allen.apollo; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.lang.reflect.InvocationTargetException; @RestController @Slf4j public class SpringValueController { @Value("${test:123}") public String zax; @Value("${test:123}") public String test; @Value(("${zed:zed}")) public String zed; @GetMapping("/test") public String test(String a, String b) { if (!StringUtils.isEmpty(a)) { try { for (SpringValue springValue : SpringValueCacheMap.map.get("test")) { springValue.update(a); } for (SpringValue springValue : SpringValueCacheMap.map.get("zed")) { springValue.update(b); } } catch (IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); } } return String.format("test: %s, zax: %s, zed: %s", test, zax, zed); } }
“SpringBoot2动态@Value怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!
分享标题:SpringBoot2动态@Value怎么实现
URL链接:http://scjbc.cn/article/jcpejh.html