简介
其实前面文章我们已经介绍过了如何定义spring表达式的解析模版,但是那是直接使用表达式api的形式,对于使用spring的同学来说,更优雅的方式就是可以自定义一个扩展去修改
本文就是介绍如何通过Spring的扩展点修改表达式解析模版
自定义解析模版
首先AbstractBeanFactory就有有一个解析器BeanExpressionResolver,这个前面文件介绍过,默认是一个StandardBeanExpressionResolver
public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {
    private BeanExpressionResolver beanExpressionResolver;
    public BeanExpressionResolver getBeanExpressionResolver() {
        return this.beanExpressionResolver;
    }
}
而StandardBeanExpressionResolver恰好也有修改解析版本的方法
public class StandardBeanExpressionResolver implements BeanExpressionResolver {
    public void setExpressionPrefix(String expressionPrefix) {
		this.expressionPrefix = expressionPrefix;
	}
	public void setExpressionSuffix(String expressionSuffix) {
		this.expressionSuffix = expressionSuffix;
	}
}
那么其实就是对BeanFactory的一个扩展,在spring中针对于BeanFactory的后置处理器就是 BeanFactoryPostProcessor
下面我们就来实现一下
@Component
public class SpElPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        BeanExpressionResolver beanExpressionResolver = beanFactory.getBeanExpressionResolver();
        if (beanExpressionResolver instanceof StandardBeanExpressionResolver) {
            StandardBeanExpressionResolver resolver = (StandardBeanExpressionResolver) beanExpressionResolver;
            // 修改
            resolver.setExpressionPrefix("&{");
            resolver.setExpressionSuffix("}");
        }
    }
}
修改表达式模版为 &{}
测试
@ComponentScan({"com.shura"})
public class AppConfig {
}
public static void main(String[] args) {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
    BeanExpressionResolver beanExpressionResolver = context.getBeanFactory().getBeanExpressionResolver();
    Object result = beanExpressionResolver.evaluate("&{appConfig}", new BeanExpressionContext(context.getBeanFactory(), null));
    System.out.println(result);
}
输出
com.shura.config.AppConfig@3e58a80e
欢迎关注,学习不迷路!







