Когда использовать autwiring в Spring
Я читаю книгу Pro Spring 3. У него есть определенный параграф, который меня действительно смутил. В параграфе мы говорим об автопостановке в spring. Вот выдержка:
В большинстве случаев ответ на вопрос о том, следует ли использовать autwiring определенно "нет!" Autowiring может сэкономить ваше время в небольших приложений, но во многих случаях это приводит к негибкий в больших приложениях. Использование byName кажется хорошим идея, но это может привести к тому, что вы дадите своим классам искусственную собственность чтобы вы могли использовать функциональность автоувеличивания. Вся идея Spring заключается в том, что вы можете создавать свои классы, как вам нравится и Spring работает для вас, а не наоборот...
... Для любого нетривиального приложения избегайте автоустановки вообще затраты.
Я всегда использовал тег @Autowired в приложениях, которые я создал. Может кто-нибудь объяснить, что с ним не так, и что я должен использовать вместо этого?
Небольшой пример того, как я сейчас обрабатываю большинство вещей:
@Service("snippetService")
public class SnippetService {
@Autowired
private TestService testService;
public Snippet getSnippet() {
return testService.getSnippet();
}
}
Использует autwiring как это "неправильно", или я что-то не хватает?
Ответы
Ответ 1
Я считаю, что здесь есть две вещи. Под "autowiring" в этой главе подразумевается маркировка bean для автоматического обнаружения и впрыска зависимостей. Это может быть достигнуто установкой атрибута "autowire" bean.
Это фактически противоречит использованию @Autowired
, где вы явно указываете поле или сеттер для инъекции зависимостей.
Посмотрите здесь: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/beans.html#beans-factory-autowire.
Чтобы объяснить это, предположим, что у вас
public class SnippetService {
private TestService testService;
public Snippet getSnippet() {
return testService.getSnippet();
}
public void setTestService(TestService testService) {
this.testService = testService;
}
}
Если вы определили bean:
<bean class="mypackage.SnippetService" autowire="byType"/>
spring попытается ввести bean типа соответствия, TestService
в этом случае, вызвав setTestService setter. Даже если вы не использовали @Autowired
. Это действительно опасно, поскольку некоторые установщики не могут быть вызваны spring.
Если вы установите autowire = "no", ничего не будет введено, если не отмечено так с помощью @Autowired
, @Resource
, @Inject
.
Ответ 2
Нет ничего плохого в том, что у вас есть, особенно если вы начинаете с одной реализации TestService
в любом случае. Как отмечает Йохан, лучше использовать @javax.annotation.Resource
, который также позволяет вам быть более конкретным, если вам нужно (например, используя атрибут name
или type
).
Ответ 3
Единственная проблема, которую я вижу здесь, заключается в том, что вы немного теряете контроль. Например, скажем, что у вас есть два или более экземпляра TestService
в вашем приложении, и вы хотите использовать один из них. Сделать Autowire
делает сложнее, чем использовать config XML для инъекций для вас. Это то, что ваша книга пытается указать, т.е. Становится сложнее/сложнее в большом приложении, где такие потребности более часты.
Если у вас нет таких ситуаций, я думаю, что это хорошо.
Ответ 4
Autowire через XML полностью безопасен и полезен, если вы создаете автосоздание на основе конструктора, особенно если вы сделаете коллабораторы закрытыми.
Я очень шокирован, автор сказал, что, когда я сделал это в чрезвычайно большом проекте spring 2.5 пару лет назад. (в то время, когда поддержка аннотаций не работала в JBoss)