@Autowired vs @Required on setter
Мне любопытно узнать, какая разница между этим кодом:
class MyClass {
@Autowired
MyService myService;
}
и код:
class MyClass {
MyService myService;
@Required
public void setMyService(MyService val) {
this.myService = val;
}
}
Ответы
Ответ 1
@Autowired
аннотация используется, если вы хотите автоувеличивать bean. @Autowired
не ограничивается установщиком. Он также может использоваться с конструктором и полем. Если вы используете аннотацию @Autowired
в поле, это поле будет автоувещено с bean, имеющим соответствующий тип данных.
@Required
проверяет, установлено ли определенное свойство или нет. Если поле аннотируется аннотацией @Required
и это поле не задано, вы получите org.springframework.beans.factory.BeanInitializationException
.
См:
Spring @Пользовательское использование
Рекомендуемое использование Spring @Required аннотации
Изменить: как указано "kryger": поле, аннотированное с помощью @Autowired
, эффективно также @Required
(если вы явно не задали свой параметр для false).
например:
@Autowired(required=false)
private ObjectType objectType;
Для поля, которое было аннотировано @Autowired
, если bean с подходящим типом данных в недоступном состоянии, org.springframework.beans.factory.BeanCreationException
выбрано.
Ответ 2
@Autowired
- это не то же самое, что @Required
.
@Autowire
-Annotation (как в вашем примере кода) сообщает ApplicationContext (он же Spring-IoC-Container) для внедрения желаемой зависимости. (Независимо от того, как, если это с помощью аннотаций или XML файл ApplicationContext).
@Required
-Annotation сообщает ApplicationContext, что это свойство должно быть упомянуто в XML файле (XML файл ApplicationContext), что приводит к зависимости, вводимой с помощью XML файла (или к ожидание конечно). Но аннотация сама по себе не говорит, чтобы вводить зависимость! Внедрение сделано, потому что свойство упоминается в XML файле. Это хорошо знать, вам это может понадобиться.
С упоминанием свойства в XML файле я имею в виду такую конфигурацию, например:
<bean id="MyClass" class="com.myclasses.common.MyClass">
<property name="someProperty" value="ValueThatHasToBeInjected" />
</bean>
Так почему я должен использовать его поверх @Autowired -Annotation?
Вы должны использовать его, когда зависимость должна быть введена информацией в файле XML-конфигурации.
Можете ли вы дать мне пример?
Ну, на этом сайте уже есть очень хороший пример . где это тоже объясняется.