2010-06-06 14 views
6

Est-il correct que je peux mettre context:annotation-config dans ma config XML et il va automatiquement injecter la classe de bean sans avoir besoin d'annotations?Est-ce que contexte: annotation-config est une alternative à @AutoWired?

Ainsi, au lieu d'utiliser ces types d'annotations:

public class Mailman 
{ 
    private String name; 

    @Autowired 
    private Parcel Parcel; 

    public Mailman(String name) 
    { 
     this.name = name; 
    } 

    @Autowired 
    public void setParcel(Parcel Parcel) 
    { 
     this.Parcel = Parcel; 
    } 

    @Autowired 
    public void directionsToParcel(Parcel Parcel) 
    { 
     this.Parcel = Parcel; 
    } 

} 

Je voudrais juste besoin d'écrire ceci:

<beans ... > 
<bean id="mailMan" class="MailMan"> 
<constructor-arg value="John Doe"/> 
</bean> 
<bean id="parcel" class="Parcel" /> 
<context:annotation-config /> 
</beans> 

puis ma classe MailMan ressemblerait beaucoup plus simple sans avoir besoin d'annotations:

public class Mailman 
{ 
    private String name; 

    private Parcel Parcel; 

    public Mailman(String name) 
    { 
     this.name = name; 
    }  
} 

Répondre

6

Par défaut, un contexte Spring ne tient pas compte des annotations @Autowired. Afin de les traiter, le contexte doit avoir un bean AutowiredAnnotationBeanPostProcessor enregistré dans le contexte.

<context:annotation-config/> Enregistre un de ceux-ci pour vous (ainsi que quelques autres), vous en avez donc besoin (sauf si vous enregistrez vous-même AutowiredAnnotationBeanPostProcessor, ce qui est parfaitement valide).

Si vous n'aimez pas avoir @Autowired dans votre code, alors vous pouvez injecter explicitement des propriétés dans le XML en utilisant <property>, ce qui déplace le fouillis d'un endroit à un autre.

Si votre contexte est extrêmement simple, alors vous pouvez utiliser autowiring implicite, comme décrit here. Essentiellement, cela indique à Spring de s'autowire automatiquement par le nom ou le type de propriété. Cela a exigé très peu de configuration, mais il devient très rapidement incontrôlable - sa nature automatique signifie qu'il est difficile à contrôler et vous donne très peu de flexibilité.

@Autowired est vraiment la meilleure option, en général.

1

<context:annotation-config /> seulement registres automatiques tout poste de haricot norme proc Essors fournis par Spring comme PersistenceAnnotationBeanPostProcessor, AutowiredAnnotationBeanPostProcessor, CommonAnnotationBeanPostProcessor et RequiredAnnotationBeanPostProcessor, de sorte que vous n'avez pas à les enregistrer individuellement dans votre fichier de contexte de printemps. Vous devez toujours fournir les annotations @Autowired sur les attributs/setter comme précédemment.

0

n °

@Autowired Les annotations sont nécessaires sur la classe ainsi que <context:annotation-config/>

La partie configuration XML n'est pas nécessaire lors de l'utilisation des annotations. Notez également que <context:annotation-config/> ne recherche que les annotations sur les beans dans le même contexte d'application que celui dans lequel il est défini. Cela signifie que si vous insérez un WebApplicationContext pour un DispatcherServlet, il vérifie uniquement les beans @Autowired dans votre contexte. contrôleurs, et non vos services.

Si vous n'avez pas besoin d'utiliser des annotations, vous devez spécifier la configuration xml.