web-dev-qa-db-fra.com

@Autowired vs @Required on setter

Je suis curieux de savoir quelle est la différence entre un code comme celui-ci:

class MyClass {
   @Autowired
   MyService myService;
}

et un code comme celui-ci:

class MyClass {
   MyService myService;

   @Required
   public void setMyService(MyService val) {
       this.myService = val;
   }
}
25
0x56794E

@Autowired l'annotation est utilisée lorsque vous souhaitez câbler automatiquement un bean. @Autowired n'est pas limité au setter. Il peut également être utilisé avec un constructeur et un champ. Si tu utilises @Autowired annotation sur un champ, ce champ sera automatiquement câblé avec un bean ayant un type de données correspondant.

@Required vérifie si une propriété particulière a été définie ou non. Si un champ a été annoté avec @Required annotation et ce champ n'est pas défini, vous obtiendrez org.springframework.beans.factory.BeanInitializationException.

Référer:

Spring @Autowired usage

tilisation recommandée de l'annotation @Required de Spring

Edit: Comme indiqué par 'kryger': champ annoté avec @Autowired est effectivement aussi @Required (sauf si vous définissez explicitement son paramètre requis sur false). par exemple:

@Autowired(required=false)
private ObjectType objectType;

Pour un champ qui a été annoté @Autowired, si le bean avec le type de données correspondant n'est pas disponible, org.springframework.beans.factory.BeanCreationException Est lancé.

35
Sudarshan_SMD

@Autowired n'est pas la même chose que @Required.

Le @Autowire- L'annotation (comme dans votre exemple de code), indique à ApplicationContext (alias Spring-IoC-Containter) d'injecter la dépendance souhaitée. (Peu importe comment, si c'est en utilisant des annotations ou le fichier XML du ApplicationContext).

Le @Required- Annotation , indique à ApplicationContext que cette propriété doit être mentionnée dans le fichier XML (The XML-File of the ApplicationContext), ce qui conduit à l'injection de la dépendance en utilisant le Fichier XML (ou à une attente bien sûr). Mais l'annotation à elle seule ne dit pas d'injecter la dépendance! L'injection est effectuée car la propriété est mentionnée dans le fichier XML. C'est bon à savoir, vous en aurez peut-être besoin.

En mentionnant la propriété dans un fichier XML, je veux dire une telle configuration par exemple:

<bean id="MyClass" class="com.myclasses.common.MyClass">
     <property name="someProperty" value="ValueThatHasToBeInjected" />
</bean>

Alors pourquoi devrais-je l'utiliser sur l'annotation @ Autowired?

Vous devez l'utiliser lorsque la dépendance doit être injectée par les informations du fichier de configuration XML.

Pouvez-vous me donner un exemple?

Eh bien, il y a déjà un très bon exemple sur ce site Web. où cela est également expliqué.

8
watchme