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

@Autowired vs @Required on setter

Мне любопытно узнать, какая разница между этим кодом:

class MyClass {
   @Autowired
   MyService myService;
}

и код:

class MyClass {
   MyService myService;

   @Required
   public void setMyService(MyService val) {
       this.myService = val;
   }
}
4b9b3361

Ответ 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-конфигурации.

Можете ли вы дать мне пример?

Ну, на этом сайте уже есть очень хороший пример . где это тоже объясняется.