如何动态改变spring容器中的bean的属性值

400 阅读1分钟

背景

今天写单测的时候,想进行代码覆盖,有一个条件分支基于启动的属性,如下:

@Value("${isPublic:false}")
private Boolean isPublic;
.....
if (isPublic){
   // 发送mq
} else {
   // 发送事件
}

isPublic 在springboot 容器启动加载的时候已经赋值,想走到另一个分支,只能通过反射去改变这个属性值

注意点

springboot 通过ApplicationContext 上下文获取到的对象,一般都是spring 代理的对象,直接反射是改变不了属性值的,必须通过

AopUtils.getTargetObject

方法获取原始对象

具体操作

  1. 引用 具体 类
@Autowired
private PublicFiledService publicFiledService;
  1. 获取到原始对象,并通过反射改变值
PublicFiledService targetObject = AopUtils.getTargetObject(publicFiledService);
try {
   Field field = PublicFiledService.class.getDeclaredField("isPublic");
   field.setAccessible(true);
   ReflectionUtils.setField(field, targetObject, true);
} catch (NoSuchFieldException e) {
   e.printStackTrace();
}

AopUtils 在 org.springframework.aop.support 包下; ReflectionUtils 在 org.springframework.util 包下;