Я хочу создать два bean-компонента одного класса через конфигурационный файл xml. У класса есть аннотированный установщик, который будет заполнен весной. В одном из определений бина я также предоставляю значение вручную, чтобы переопределить одно из аннотации. Но когда я делаю это, пружина больше не обрабатывает проводку аннотации.
Ниже приведен минимальный код для демонстрации этого эффекта, для простоты используется @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;
}
}
и конфигурация пружины:
<bean id="au_test1" class="AutowireTest">
<property name="testField" value="manual"/>
</bean>
<bean id="au_test2" class="AutowireTest"/>
Если я удаляю <property name="testField" value="manual"/>
, оба бина получают «default». Если это там, второй бин бросает исключение. Я взглянул на весенний код, и AutowiredAnnotationBeanPostProcessor
используетjectionMetadataCache, где классы являются ключами для метаданных внедрения, то есть установка определенного свойства для одного бина отключает автопроводку для других экземпляров.
Есть идеи, почему это так? Как я могу добиться подобного эффекта, работая не только со строковыми значениями, но и с объектными бинами?
EDIT:
Я хочу иметь свойство, где есть несколько подходящих кандидатов. Один помечен как primary
. Если я не укажу кандидата вручную через xml, я бы хотел, чтобы основной был подключен. Мой оригинальный подход заключался в использовании @Autowired для этого свойства, но так как это не работает, я ищу альтернативу. По какой-то причине я не хочу использовать наследование бобов.
EDIT2:
Если я поменяю местами два определения бина, проблема не возникнет. Свойство автоматически подключается до тех пор, пока не будет обнаружено ручное переопределение в первый раз. Это означает, что это не намеренная функция, так как она может привести к странным и трудным обнаружениям ошибок в некоторых проектах с зависимостями, не связанными должным образом.