【问题标题】:Spring bean post processor: inject a valueSpring bean后处理器:注入一个值
【发布时间】:2019-11-28 12:09:41
【问题描述】:

我有一个 BeanPostProcessor bean,我想用 application.properties 文件中的值注入两个字符串变量。但是,它们不会被注入并留下占位符的值。

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Value("${property1}")
    private String property1;

    @Value("${property2}")
    private String property2;

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        ...
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
       ...
       return bean;
    }
}

在这两种方法中,变量的值都是${property1}${property2}。 我已经尝试将它们注入到一个普通的 bean 中并且它工作正常,所以它肯定必须对 BeanPostProcessor 的 bean 做一些事情。
有没有办法以某种方式注入价值?我正在使用 Spring Boot 2.2.0。

【问题讨论】:

  • 您是否尝试将它们注入到 另一个 类中,然后使该类成为 BeanPostProcessor 的依赖项?可能是spring在之前创建了bean后处理器,无论它是检索@Value
  • 刚试了一下,值还是用占位符填充的。但是,有一个解决方法 - 我为这些道具制作了一个 @ConfigurationProperties bean,它会自动装配到具有已填充值的 bpp bean。感谢您的提示!

标签: java spring spring-boot


【解决方案1】:

这是故意的。 @Valuedocs

请注意,@Value 注释的实际处理是由 BeanPostProcessor 执行的,这反过来意味着您不能在 BeanPostProcessor 或 BeanFactoryPostProcessor 类型中使用 @Value。请查阅 AutowiredAnnotationBeanPostProcessor 类的 javadoc(默认情况下,该类会检查此注解是否存在)。

作为一种解决方法,例如,您可以在标记为 @Configuration 的类中手动将后处理器创建为 bean,然后将该值作为构造函数参数传递。

【讨论】:

  • 谢谢!我还在问题的 cmets 中提出了解决方法。
  • 是的,用@ConfigurationProperties 代替@Value 也是可能的(而且,在我看来,更优雅)
  • 我试过了,不行。属性值仍为 null。这种方法有效的是:stackoverflow.com/a/27813297/58962
猜你喜欢
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
  • 2011-08-16
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
相关资源
最近更新 更多