Как переопределить аннотацию Spring @Autowire и установить для поля значение null?

Я-весенний неофит, который работает над большим весенним проектом, который имеет обширную связь между весенними бобами. Я пытаюсь написать некоторые интеграционные тесты, которые реализуют подмножества общей функциональности приложения. Для этого я хотел бы переопределить некоторые из autowiring. Например, предположим, что у меня есть class

public class MyDataServiceImpl implements MyDataService {
    @Qualifier("notNeededForMyDataServiceTest")
    @Autowired
    private NotNeededForMyDataServiceTest notNeededForMyDataServiceTest;
    //...
}

и контекстный файл с:

<bean id="myDataService"
      class="MyDataServiceImpl">
</bean>

в моем тесте мне не нужно использовать notNeededForMyDataServiceTest поле. Есть ли способ я могу переопределить the @Autowired аннотация и набор notNeededForMyDataServiceTest в null, возможно, в XML-файле? Я не хочу изменять ни один из классов Java, но я хочу избежать (проблемной) конфигурации notNeededForMyDataServiceTest.

Я пытался сделать:

<bean id="myDataService"
      class="MyDataServiceImpl">
    <property name="notNeededForMyDataServiceTest"><null/></property>
</bean>

это не сработает. IntelliJ сообщает мне ,что" не может разрешить свойство "notNeededForMyDataServiceTest"", по-видимому, потому, что для этого поля нет геттеров и сеттеров.

Я использую Spring Framework 3.1.3.

3 ответов


следующая конфигурация должна работать, я взял на себя смелость смешивать в конфигурации Java

@Configuration
//This will load your beans from whichever xml file you are using
@ImportResource("classpath:/path/beans.xml")
public class TestConfigLoader{
    // This will declare the unused bean and inject MyDataServiceImpl with null.
    public @Bean(name="notNeededForMyDataServiceTest") NotNeededForMyDataServiceTest getNotNeededForMyDataServiceTest(){
        return null;
    }
... any other configuration beans if required.
}

и аннотируйте свой тестовый класс следующим образом:

// In your test class applicationContext will be loaded from TestConfigLoader
@ContextConfiguration(classes = {TestConfigLoader.class})
public class MyTest {
    // class body...
}

Это может помочь:

и профилей:

вы можете создать другое определение компонентов в XML конфигурация, а затем активировать их с помощью -Dspring.profiles.active="profile1,profile2" env.


вы используете @Autowired неправильный механизм. Квалификатор не свойство, которое необходимо задать. На самом деле это имя компонента, так что контейнер сможет выбрать один конкретный экземпляр в случае, если несколько компонентов одного типа определены в одном контексте.

таким образом, контейнер будет искать Боб типа NotNeededForMyDataServiceTest и имя (которое на самом деле было бы bean id в XML): notNeededForMyDataServiceTest.

то, что я думаю, вы хотите проинструктировать контейнер не вводить ничего в это поле, если нет Боба типа NotNeededForMyDataServiceTest определяется в контексте приложения. Это может быть достигнуто просто установив аннотации false:

@Autowired(required = false)
NotNeededForMyDataServiceTest someOptionalDependency;

единственным недостатком этого подхода было бы то, что контейнер никогда не будет жаловаться во время выполнения, если в это поле нечего вводить (и, возможно, вы захотите проверить это здравомыслие, когда ваш код запускается производство.)


если вы не хотите делать эту зависимость необязательной (или вы не можете редактировать этот код по какой-либо причине), вам нужно будет предоставить макет / null значение для этого поля, задав это явно в вашем контексте. Один из вариантов сделать это - использовать конфигурацию Java вместо XML (как в ответе @Abe), а другой подход-использовать заводской компонент, который возвращает null (как в этот вопрос).