2010-06-17 8 views
2

AppContext.xmlInjecter Bean annotés dans Bean régulier

<bean id="myBean" class="com.myapp.MyClass"> 
    <property ref="myService"/> 
</bean> 

MyService.java

@Service 
public class MyService { 
... 
} 

Cela lancera une exception indiquant que se trouve pas de haricots pour la propriété "myService", que je comprends parce qu'il ne peut pas être trouvé dans les fichiers de contexte, mais je peux autowire ce champ dans d'autres beans gérés par ressort, mais je dois explicitement construire le bean dans mon contexte parce que le POJO n'est pas éditable dans la portée de mon projet.

Répondre

1

Cela devrait fonctionner, si vous avez

<context:component-scan base-package="your.root.package" /> 
+0

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

3

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?

+0

ne sera pas l'auto Le nom générique peut-il être le nom en minuscule de la classe? – Bozho

+0

@Bozho: Je ne pense pas, non. Lorsque vous utilisez '' sans 'id', le nom généré automatiquement est quelque chose comme 'B # 0', et je suppose que la même chose s'applique aux composants analysés automatiquement. – skaffman

+0

ce n'est pas le même scénario, car il ne peut y avoir un autre bean annoté de la même classe – Bozho