En supposant que vous utilisez déjà l'analyse classpath des composants, vous pouvez donner un nom explicite au composant, plutôt que de laisser générer automatiquement Spring un nom vous:
@Service("myService")
public class MyService {
...
}
Je n'ai pas testé cela, mais je crois que c'est le cas.
modifier: Après un peu de creuser, la logique pour déterminer le nom de haricot se trouve dans AnnotationBeanNameGenerator.generateBeanName()
.
public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
if (definition instanceof AnnotatedBeanDefinition) {
String beanName = determineBeanNameFromAnnotation((AnnotatedBeanDefinition) definition);
if (StringUtils.hasText(beanName)) {
// Explicit bean name found.
return beanName;
}
}
// Fallback: generate a unique default bean name.
return buildDefaultBeanName(definition);
}
En d'autres termes, il tente d'obtenir un nom de haricot explicite l'annotation (s), et à défaut, il utilise la valeur par défaut:
protected String buildDefaultBeanName(BeanDefinition definition) {
String shortClassName = ClassUtils.getShortName(definition.getBeanClassName());
return Introspector.decapitalize(shortClassName);
}
Alors oui, pour une classe annotée appelée MyService
, le nom du bean généré automatiquement doit être myService
, donc votre code devrait fonctionner. Par curiosité, que se passe-t-il quand vous utilisez @Component
au lieu de @Service
?
J'ai des choses à travailler, mais je ne sais pas exactement comment, je vais devoir passer un peu plus de temps à enquêter, mais je vais revenir à cela et choisir et répondre bientôt – walnutmon