2016-08-30 8 views
2

Я знаю и понимаю конструкторскую инъекцию. Но режимы автоустройства меня путают. 1) Я прочитал, что режим по умолчанию для autowiring - это «нет autowiring». I.e. Мы должны вручную установить свойства в xml-файле. Но, isnt xml основанная конфигурация тип autowiring? Как его можно считать «без автопомощи»? 2) Другие режимы для автоустройства: i) byName ii) byType iii) конструктор iv) автообнаружение. Правильно ли я предполагаю следующее:В чем разница между «инъекцией на основе конструктора» и «autwire by constructor mode» весной

a) При использовании автоустановки на основе конфигурации xml режим по умолчанию - «byName» (т.е. мне нужно сохранить имя ссылки свойства так же, как имя компонента, который находится используется как свойство.)

b) При использовании аннотаций режим по умолчанию - «byType» (независимо от места размещения ключевого слова @Autowired, т.е. на установщике, на конструкторе или на свойстве он будет искать тип имущества, авторизованного)

3) В чем разница между установкой на основе конструктора и режимом «конструктора» автоувеличивания. (Я прочитал, что режим конструктора означает, что он применяется по типу на всех аргументы конструктора, но как это отличается от размещения @Autowired keyowrd в конструкторе)

4) Я знаю, что для включения автообновления byName в аннотации, в определении компонента в XML-файле, я должен использовать «autowire = 'byName' ". Но, предположим, я использую только конфигурацию Annotations (используя @Component и никакие определения bean-компонентов в xml), и я хочу использовать режим autowire byName, тогда как это сделать?

ответ

0

Я думаю, вы немного смущены. Во-первых, вам нужно понять инъекцию зависимостей (см. here). Существует тонна информации о DI, но, в общем, это означает, что какая-то третья сторона (например, Spring IOC) передает зависимости к объектам, а не объектам для создания/получения самих ссылок. Это может произойти либо с помощью конструктора, либо с помощью setter.Рассмотрим, например, конструктор DI

class B{ 
} 

class A{ 
    private B b; 
    public A(B b){ 
    this.b = b; 
    } 
} 

Некоторые третьей стороной вольет экземпляр класса B в A, а класс А создать ссылку на B себя. Очень часто вы должны использовать интерфейс, чтобы класс A даже не знал, какой объект будет в него вложен.

Теперь весной существуют различные способы настройки этих ассоциаций между объектами (пример выше). Вы можете использовать XML, Java Config или Autowiring. Они независимы, но делают то же самое.

В конфигурациях XML и JAVA вам необходимо явно настроить зависимости - либо в XML-файле, либо класс @Configuration для JAVA Config и аннотировать компоненты с помощью @Bean. Автоувеличивание отличается. Там вы создаете простые POJO, которые вы комментируете с помощью @Component, @Controller, @Service или @Repository. Они будут автоматически регистрироваться как бобы с помощью сканирования компонентов. При автоподготовке вам не нужно явно настраивать зависимости в файле XML или в классе JAVA Config. Вы можете сделать это непосредственно в коде. Например, если мы должны сравнить Java конфиг против автоматического связывания, используя предыдущий пример

Java Config (explicit config in a config class) 

@Bean 
public A getA(){ 
    return new A(new B()); 
} 

Autowiring (implicit - done in code) 

    @Component 
    class B{ 
    } 

@Component 
class A{ 
    private B b; 

    @Autowired 
    public A(B b){ 
    this.b = b; 
    } 
} 

В последнем мы autowire класса B в класс A (оба они будут зарегистрированы как бобы из-за @Component аннотацию) без явного определенная ассоциация в файле xml или java config. Надеюсь, это имеет смысл.

+0

Было очень полезно понять разницу между ними. Спасибо. UserF40, и вы разъяснили большинство моих вопросов. Пара остается. Правильно ли я полагаю, что автоуведомление конструктором является способом внедрения инъекции на основе конструктора? Кроме того, можете ли вы дать мне знать, как использовать автоматическое определение режима автообновления с помощью аннотаций, а не xml? –

+0

задайте другой вопрос, и вы получите ответ, чтобы другие люди могли воспользоваться – george

+0

Ok.will do that. Благодарю. –

1

Если вам нужно указать имена компонентов в xml, это не происходит автоматически, следовательно, это не автоустановка.

С пружиной autowiring вы узнаете, какой компонент нужно вводить, даже если он не может быть явно записан.

При использовании автоматического связывания на основе конфигурации XML, режим по умолчанию «Byname»

При использовании аннотаций, упорядочение, что происходит, зависит от аннотации используется, поскольку есть несколько, которые могут быть использованы. @Autowire@Resource@Inject.

При использовании @Component проводка по умолчанию имеет тип. Ниже приведенный метод будет разрешен при любых потребностях автоувеличивания для объекта службы.

@Bean 
public Service getMyService(){ 
return new Service(); 
} 

Если есть несколько @Bean методы, которые возвращают службу, вы получите сообщение об ошибке.

Если вы хотите сделать провод через имя при использовании @Component, вы должны добавить аннотацию @Qualifier("nameToUse") к переменной. Он найдет @Bean аннотированный метод под названием getNameToUse().

@Autowired 
@Qualifier("nameToUse") 
private Service myService; 
+0

Ok.So, я понимаю, что когда мы используем конфигурацию на основе xml, это не autowiring. Но предположим, что я использую xml config для определения bean-аннотаций и аннотаций для autowiring (т.е. я не использую @ Component, @ Service, и т. д.) Теперь, если я поместил @ Autowired keyowrd над объявлением свойства, это byType? И wht, если я поместил его над конструктором или сеттером? (Обратите внимание, что я не спрашиваю об установке на основе setter/constructor). Это ссылка, за которой я следую: http://howtodoinjava.com/spring/spring-core/spring-beans-autowiring-concepts/ Также: http: //www.journaldev.com/2623/spring-autowired-annotation –

+0

Как уже упоминалось в ответе @Autowire по типу сначала – UserF40

+0

Затем, что мы подразумеваем под режимом «autowire by constructor»? Я понимаю режимыName и byType, но не другие два режима, а именно: «конструктором» и «автоматическим обнаружением». Они упоминаются в приведенных выше ссылках. –