忽略Spring Bean Post Processor中依赖库的@Value字段处理

问题描述 投票:2回答:1

我将一个项目用作另一个项目的依赖项。依赖项目中的类之一如下:

@Service
public class Dependency {

  @Value("${xyz.value}")
  private String xyz;

  @Value("${abc.value}")
  private String abc;

  public Dependency() {

  }

  public Dependency(String xyz, String abc) {
    this.xyz = xyz;
    this.abc = abc;
  }
}

我试图在启动时在另一个项目中创建Dependency的实例,如下所示:

@Configuration
@PropertySource(value = {
    "classpath:appEnv.properties"
}, ignoreResourceNotFound = true)

public class Test {

  @Bean(name = "dependencyBean")
  public Dependent getDependent() {
    return new Dependent("xyz", "abc");
  }
}

尝试访问如下创建的dependencyBean

public class SomeClass {

  AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
  Dependent d = ctx.getBean("dependencyBean"); 

}

我收到以下异常

BeanCreationException:创建名称为'DependentBean'的bean时出错:自动连接依赖项的注入失败;嵌套的异常是org.springframework.beans.factory.BeanCreationException:无法自动连线字段:private java.lang.String xyz;

[如何在不调用试图解析带有postProcessPropertyValues批注的字段的@Value的情况下创建依赖类的实例?

java spring-boot spring-annotations
1个回答
0
投票

您可以插入一些默认值,只是为了避免在找不到属性时出现错误;

@Value("${xyz.value:dummy}")

然后,您可以启用Bean覆盖;

spring.main.allow-bean-definition-overriding=true

并且只是让您的自定义bean的名称与@Service带注释的类的确切名称;

@Primary
@Bean(name = "dependency")
public Dependency getDependent() {
    return new Dependency("xyz", "abc");
}

因此,允许使用虚拟的Dependency默认值创建默认的@Value,但使用手动初始化的bean覆盖它。

但是要实现这一点,首先必须禁止自定义的getDependent()结果bean触发@Value批注,为此,您需要将Dependency@Value注入方法更改为构造函数。否则,您的自定义bean也将触发@Value注释,并使用xyz值覆盖您手动输入的abc"dummy"字段。

@Service
public class Dependency {

    private String xyz;
    private String abc;

    public Dependency() {
    }

    @Autowired
    public Dependency(@Value("${xyz.value:dummy}") String xyz, @Value("${abc.value:dummy}") String abc) {
        this.xyz = xyz;
        this.abc = abc;
    }
}

有了这些更改,您的自定义bean自动装配就不会出错。

© www.soinside.com 2019 - 2024. All rights reserved.