Подтвердить что ты не робот

Когда использовать 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 как это "неправильно", или я что-то не хватает?

4b9b3361

Ответ 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)