2013-06-03 3 views
2

J'ai une annotation personnalisée qui est déclarée en tant que service géré printemps:Désactiver le Autowiring pour le printemps @Service

@Service 
public @interface MyServiceAnnotation { 
    // my service url 
    String url(); 
} 

The above declaration enables my services to be autowired as Spring Managed beans. 
@MyServiceAnnotation(url="/path/serviceLocation") 
public class SomeService { 
    doWork(); 
} 

Cependant, il y a certains services qui ont leurs définitions de haricots dans un applicationContext.xml. L'ajout de @MyServiceAnnotation à ces beans les rend tous deux Autowiring activés, ainsi qu'injecter dependecy à travers le fichier xml. En raison de problèmes liés au code hérité, je ne veux pas supprimer les définitions de beans xml et les rendre toutes autowired.

Alors, existe-t-il un moyen de désactiver l'autowiring dans ce cas, et d'utiliser @MyServiceAnnotation? Idéalement je voudrais avoir l'annotation @Service sur MyServiceAnnotation, les services existants utiliseraient toujours le @MyServiceAnnotation mais recevraient leurs dépendances injectées basées sur le xml. Tous les nouveaux services seraient autowired sans les définitions de bean xml.

Une approche possible consiste à créer NonSpringManagedMyServiceAnnotation identique à MyServiceAnnotation, mais sans l'annotation @Service. L'inconvénient de ceci est que je devrais dupliquer le reste du code de MyServiceAnnotation, ce que je ne veux pas.

+2

Vous confondez deux sujets différents - ** Autowiring ** n'a rien à voir avec votre question. Ce que vous voulez, c'est supprimer ** enregistrement de définition de bean ** fait par ** scannage de composant **. –

+0

Ma question était de garder la définition du bean et de supprimer l'analyse des composants dans un scénario, et de garder l'analyse des composants dans l'autre ... Le filtre d'exclusion semble être une solution raisonnable dans ce cas. – user841717

Répondre

3

Ceci est une approche, mais peut-être pas optimale. Je suppose que vous auriez spécifié une balise component-scan dans votre fichier XML pour balayer les classes ayant les annotations de stéréotype Spring, ces balises prennent en charge un sous-balise exclude-filter pour ignorer des modèles spécifiques. Si les fichiers que vous spécifiez suivent un modèle spécifique (packages spécifiques, noms spécifiques, etc.), vous pouvez simplement spécifier cette sous-balise pour ignorer les classes contenant votre annotation.

<context:component-scan base-package="mypackage"> 
    <context:exclude-filter type="regex" expression=".*ToBeIgnoredNaming"/> 
</context:component-scan> 
0

Je pense que vous devriez essayer de maintenir la séparation de préoccupation. L'ajout de @Service sur votre annotation en fait un service Spring de facto: puisque ce n'est pas le comportement que vous voulez, vous pouvez simplement avoir un @MyAnnotation simple (avec propriété url) sur chaque service (héritage et nouveau). Ensuite, vous ajoutez l'annotation @Service de Spring sur chaque nouveau service pour activer l'enregistrement du bean par annotation.

+0

Veuillez ne pas mélanger les termes * autowiring * et * enregistrement de définition de bean * (via le balayage de composants) comme l'OP. –

+0

Réécrire l'article sans faire une lecture complète est une vraie honte ... Merci pour le commentaire. Correction pour éviter la confusion des gens. –

Questions connexes