2015-12-31 143 views
2
Project X 
--------- 
public class A {} 

Public class B{ 
    @Autowire 
    private A a; 

    @Autowire 
    private D d; 
} 


Project Y 
--------- 
Public class C{ 
    public static void main(String[] args) throws Exception { 
     ApplicationContext context = new ClassPathXmlApplicationContext("spring/application-Context.xml"); 
     B b = context.getBean("b", B.class); 
    } 
} 

application-Context.xml 
<bean id="a" class="A" /> 
<bean id="b" class="B" /> 

問: 我有安裝上面的一樣,在那裏我有項目X的二進制文件,目前我的工作項目Y.我想沒有項目創建d創建B類對象Y.做這件事的最好方法是什麼?忽略春天依賴注入:XML

+0

你不能改變的B類?你只有二進制? –

+0

是的,沒有觸摸項目X – Nihanth

回答

1

您可以在自動佈線註釋中使用此字段。

@Autowired(required=false) 
private D d; 

如果您無法訪問項目X,則必須進行某種破解。

在您的項目上創建標記爲服務的類並擴展D類,因此在這種情況下,spring會注入您的類。

@Component 
@Primary 
public class MockD extends D { 

} 

在這種情況下@Primary會說春天要優先考慮這個,而不是其他實施。所以你的班級將被注入B級

+0

問題是我沒有訪問項目X – Nihanth

+0

編輯我的評論,這是一個黑客,但你沒有任何其他選擇,如果你不能在我的應用程序上下文中訪問項目x – Aviad

0

依賴注入從來不是強制性的。這取決於他/她想要注入或不注入bean的程序員。

application-Context.xml 
<bean id="a" class="A" /> 
<bean id="b" class="B" > 
    <property name="a" ref="a" /> 
</bean> 

只有當B類擴展InitializingBean和覆蓋afterPropertiesSet方法,並檢查是否d注入,那麼只有可能會導致:

所以在這裏B的定義,下面給出你可以簡單地注入只是豆一問題,否則你會對上述注射有好處。不需要創建並注入bean D。

+0

。 xml文件我有 它拋出: 引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到匹配的類型爲[xyzD]的bean:期望至少有1個bean符合此依賴關係的自動導向候選人的資格。依賴註釋:{@ org.springframework.beans.factory.annotation.Autowired(required = true)} – Nihanth

0
<!--<context:annotation-config/>--> 
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"> 
<property name="requiredParameterValue" value="false" /> 

而不是添加註釋的配置,必須添加上述一個