mre*_*isz 7 java spring dependency-injection
我想通过xml配置文件创建两个相同类的bean.该类有一个带有注释的setter,可以用spring填充.在其中一个bean定义中,我还手动提供值以覆盖注释中的一个.但是当我这样做时,弹簧不再处理注释布线.
这是一个演示此效果的最小代码,用于@Value简单,但它与以下内容相同@Autowired:
import org.springframework.beans.factory.annotation.Value;
import javax.annotation.PostConstruct;
public class AutowireTest {
public String testField;
@PostConstruct
public void init() {
if (testField == null)
throw new RuntimeException("FAIL");
}
@Value("default")
public void setTestField(String testField) {
this.testField = testField;
}
}
Run Code Online (Sandbox Code Playgroud)
和spring配置:
<bean id="au_test1" class="AutowireTest">
<property name="testField" value="manual"/>
</bean>
<bean id="au_test2" class="AutowireTest"/>
Run Code Online (Sandbox Code Playgroud)
如果我删除<property name="testField" value="manual"/>,两个bean都会收到"默认".如果它在那里第二个bean抛出一个异常.我查看了spring代码并AutowiredAnnotationBeanPostProcessor使用了injectMetadataCache,其中类是注入元数据的键,这意味着为一个bean设置特定属性会禁用其他实例的自动装配.
知道为什么会这样吗?如何才能实现类似的效果,不一定是字符串值,也适用于对象bean?
编辑:我希望有一个属性,有多个匹配的候选人.一个被标记为primary.除非我通过xml手动指定候选者,否则我希望将主要的候选者连接起来.我最初的方法是使用@Autowired这个属性,但由于这不起作用,我正在寻找替代方案.出于某种原因,我不想使用bean继承.
编辑2:如果我交换这两个bean定义,问题不会发生.该属性自动装配好,直到第一次检测到手动覆盖.这意味着,这不是一个intented功能,因为它会导致怪异,难以检测与预期不被有线依赖一些项目的bug.
在我看来,这是我通过jira提交的 spring 中的一个错误。要解决此问题,必须将注释从设置器移至字段。Setter 必须留下来允许手动覆盖该属性。可能的设置器逻辑(我知道应该避免这种情况)应移至@PostConstruct. 改编后的原始代码如下:
import org.springframework.beans.factory.annotation.Value;
import javax.annotation.PostConstruct;
public class AutowireTest {
@Value("default")
public String testField;
@PostConstruct
public void init() {
if (testField == null)
throw new RuntimeException("FAIL");
}
public void setTestField(String testField) {
this.testField = testField;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2030 次 |
| 最近记录: |