2013-11-07 2 views
4

Иногда мы делаем ошибки в нашем коде и @Autowired прототип-фасоли в однобортный бобов. Это, конечно, неправильно, потому что тогда синглтон, вероятно, будет использовать эту зависимость, как если бы она была также синглом.Могу ли я перехватить Spring @Autowired для проверки проверки?

Есть ли способ перехватить процесс autowiring/DI, чтобы обнаружить это и вызвать ошибку? Это было бы для обнаружения во время разработки.

+1

Интересно, действительно. Но почему вы считаете такой сценарий недопустимым и, таким образом, вызывают ошибку? –

+1

Вы можете использовать прототип бокового участка в одномодовом бобах очень хорошо. Вам нужно использовать поддержку прокси-серверов Spring. – artbristol

+0

@kocko - из-за проблем с параллелизмом, когда два потока используют singleton, а затем взаимодействуют с прототипом bean, который имеет внутреннее состояние. –

ответ

1

Лучший способ достичь этого - через модульные тесты. Например:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = MyAppConfig.class, loader = AnnotationConfigContextLoader.class) 
public class MyServiceTest { 

    @Autowired(required = true) 
    MyService myService; 

    @Test 
    public void shouldAutowire() {} 

} 

@ContextConfiguration может использоваться с Java конфигурации, как описано выше, или оно может ссылаться на файлы конфигурации XML. Делая это, Spring будет использоваться для ввода всех ваших зависимостей всякий раз, когда вы запускаете свои тесты. Включая «required = true» на @Autowired beans, вы гарантируете, что Spring выкинет исключение на этом этапе, и ваш тест завершится неудачно. Приведенный выше пример может не выглядеть причудливым, но он гарантирует, что будут обнаружены ошибки конфигурации. Конечно, вы можете идти дальше, и ваши тесты используют впрыскиваемые бобы. Я считаю, что это очень удобно для тестов интеграции доступа к базе данных.

Это не перехват самого процесса автомашины, но вы можете, конечно, проверить, что ваши бобы ведут себя правильно.

Вам потребуется импортировать зависимость от пружинного теста. т.е. для Maven:

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-test</artifactId> 
    <version>${spring.version}</version> 
    <scope>test</scope> 
</dependency> 
+0

Не уверен, что это отвечает на мой вопрос. Проблема заключается не в том, что компонент отсутствует, а в том, что один компонент является автоуведомлением, что я считал бы недействительным компонентом из-за обзора. –

+0

Учитывая, что использование поддержки Spring JUnit приводит к тому, что Spring автоматически расшифровывает все ваши компоненты, вы можете просто посмотреть на этот компонент, чтобы убедиться, что это тот, который вы ожидаете от него. Вы также можете получить ссылку на контекст Spring, если хотите изучить его. – Steve

Смежные вопросы