2015-06-26 2 views
0

Я создаю веб-приложение, используя spring, в web.xml. Я определил context-param для поиска файла application-context.xml, который сканирует все, кроме контроллеров и app-servlet.xml, который сканирует только для контроллеров.Нужно ли создавать классы, которые используют DI, только через DI?

приложения context.xml содержит источник данных к базе данных, и я впрыснуть в источник данных DAOS так:

@Autowired 
DataSource dataSource; 

Теперь, если я пытаюсь создать DAO вручную в контроллере (я знаю, что, вероятно, должен использовать для этого сервисы, но сейчас это просто для тестирования). Я получаю исключение из null-указателя, однако, когда я вставляю DAO, он загружается правильно.

Так почему это происходит? DAO не управляются контейнером DI только для источника данных, поэтому почему я не могу создать dao вручную?

ответ

1

Да; объекты, не находящиеся под контролем Весны, ... хорошо, вне контроля Весны.

Есть несколько способов обойти это, например, разрешить new ed объектов, чтобы получить Spring DI (например, манипулирование байтовым кодом).

+0

Итак, чтобы быть понятным, если класс использует DI, его можно создать только через DI из этой точки, кроме использования манипуляции с байтовым кодом? –

+0

@JohnSmith Да; 'new' - это Java-конструктор. Spring не задействован вообще. –

2

Завод весенней фасоли и «новый» являются ортогональными: как только вы называете «новым», это в ваших руках, а не в Весне.

Общая ситуация: вы хотите, чтобы Spring управляла жизненным циклом боба и зависимостями в производстве, но при тестировании вы хотите сделать это самостоятельно с помощью mocks. Мое предложение - написать свое приложение, чтобы использовать Spring для создания DI и создания бобов, но у вас есть конструкторы для ручной инъекции макетов при тестировании.

+0

Я был уверен, что весна каким-то образом введет источник данных. В части тестирования вы подразумеваете создание некоторого конструктора только для целей тестирования? –

+0

Нет, вы можете предпочесть инъекцию конструктора (я делаю). «Как-то»? Волшебное мышление. Ваши тесты будут работать быстрее, если вы просто создадите экземпляр jdbcTemplate самостоятельно. Из этого выйдет Весна. Фабрика фасоли накладная. – duffymo

+0

Хорошо, имея пружинный впрыск в конструктор и проходящий его сам по желанию, звучит резонно. Благодарю вас, я соглашусь с ответом Дейвса, потому что он был быстрее, хотя я дал вам преимущество, если это что-то значит. –

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