我将一个项目用作另一个项目的依赖项。依赖项目中的类之一如下:
@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
的情况下创建依赖类的实例?
您可以插入一些默认值,只是为了避免在找不到属性时出现错误;
@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自动装配就不会出错。