2016-10-11 32 views
1

我有一個類註釋爲@Component,然後@Autowired爲另一個類。但是,我需要刪除此註釋,而是在其之前自動裝配的類中使用帶註釋的方法創建它@Component將批註的@Component類更改爲@Bean批註的方法

,以前的類看起來像:

@Component 
public class MyClass implements IMyClass 
{ 
    // Stuff 
} 

@Configuration 
public class MyUsingClass 
{ 
    @Autowired 
    private IMyClass myClass; 

    private void methodUsingMyClass() 
    { 
     myClass.doStuff(); 
    } 
} 

所以,現在我已經刪除了@Component註釋,寫這樣的@Bean註解的方法:

public class MyClass implements IMyClass 
{ 
    // Stuff 
} 

@Configuration 
public class MyUsingClass 
{ 
    @Bean 
    public IMyClass getMyClass() 
    { 
     return new MyClass(); 
    } 

    .... 
} 

我的問題是圍繞取代了以前的呼叫myClass.doStuff()使用新的bean。我現在在MyClass類型的參數傳遞給私有方法:

private void methodUsingMyClass(final MyClass myClass) 
{ 
    myClass.doStuff(); 
} 

...還是我直接調用此方法(似乎不正確的方式給我):

private void methodUsingMyClass() 
{ 
    getMyClass().doStuff(); 
} 

......或者這兩個都不正確?

回答

1

我想你誤解了@Bean註解。它可以用來創建一個Bean。所以基本上春天會掃描所有課程,會找到你的@Bean並創建一個Bean,而不是更多。你現在可以使用這個bean,就像使用<bean></bean>創建的一樣。要真正使用這個bean,你需要從ApplicationContext@Autowire那裏得到它。當然,您仍然可以像使用代碼中的任何其他函數一樣使用該函數來創建該對象的新實例,但這與您想要用bean實現的內容相矛盾

0

使用該批註解決方案

public class MyClass implements IMyClass{ 

    private OtherClassInjection otherClassInjection; 

    private OtherClassInjection2 otherClassInjection2; 

    MyClass(OtherClassInjection otherClassInjection, OtherClassInjection2 otherClassInjection2){ 
     this.otherClassInjection=otherClassInjection; 
     this.otherClassInjection2=otherClassInjection2; 
    } 

    public void useObject(){ 
     otherClassInjection.user(); 
    } 

}

@Bean(name = "myClass") 
@Autowired 
@Scope("prototype") //Define scope as needed 
public MyClass getMyClass(@Qualifier("otherClassInjection") OtherClassInjection otherClassInjection, 
          OtherClassInjection2 otherClassInjection2) throws Exception 
{ 
    return new MyClass(otherClassInjection, otherClassInjection2); 
} 

是合乎邏輯的,它的工作注入@Autowired當創建一個bean上下文是否是知道的bean,你會想注入。

我用那種方式。