2010-06-17 123 views
2

AppContext.xml注漿註釋豆成的bean

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

MyService.java

@Service 
public class MyService { 
... 
} 

這將拋出一個異常,指出沒有bean可以爲財產 「爲myService」 中找到,這是我理解因爲它不能在上下文文件中找到,但我可以在其他春天管理的bean中自動裝入該字段,但是我需要在我的上下文中顯式構建bean,因爲POJO在我的項目範圍內不可編輯。

回答

1

這應該工作,如果你有

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

我已經得到的東西工作,但我不完全確定如何,我將不得不多花一點時間調查,但我會回到這個並選擇並很快回答 – walnutmon 2010-06-24 13:42:38

3

你已經在使用該組件的Classpath掃描假設,那麼你可以給一個明確的名稱到組件,而不是讓春自動生成一個名字你:

@Service("myService") 
public class MyService { 
... 
} 

我還沒有測試過這個,但我相信是這樣。


編輯:挖掘一下後,確定bean名稱的邏輯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); 
} 

換句話說,它試圖從得到一個明確的bean名稱註釋(S)和做不到這一點,它使用默認:

protected String buildDefaultBeanName(BeanDefinition definition) { 
    String shortClassName = ClassUtils.getShortName(definition.getBeanClassName()); 
    return Introspector.decapitalize(shortClassName); 
} 

所以,是的,名爲的註解類210,自動生成的bean名稱的確應該是myService,所以你的代碼應該可以工作。

出於好奇,當您使用@Component而不是@Service會發生什麼?

+0

不會自動 - 生成的名稱是該類的小寫名稱? – Bozho 2010-06-17 14:35:26

+0

@Bozho:我不這麼認爲,不。當你使用沒有'id'的''時,自動生成的名字就像是'B#0',我假設這同樣適用於自動掃描的組件。 – skaffman 2010-06-17 14:50:44

+0

這不是一個場景,因爲不能有另一個同類的註釋bean – Bozho 2010-06-17 15:18:29