2014-04-12 58 views
1

我有以下代碼:春DI與構造

@Component 
public class MainBean { 

    @Autowired 
    private MyTask myTask 

    @Autowired 
    private TaskScheduler taskScheduler 


    public void start() { 

     String str = "Print something to console"; 

     //somehow call constructor and pass str argument?? 
     taskScheduler.execute(myTask); 

    } 
} 

@Component 
public class MyTask implements Runnable { 

    private String str; 

    @Autowired 
    public MyTask(String str) { 
     this.str = str; 
    } 

    @Override 
    public void run() { 

     System.out.println(str); 
    } 
} 

我想打電話給MyTask和str參數傳遞給構造函數。我怎樣才能做到這一點?我無法在任何地方找到好的例子。

回答

1

如果我理解正確你正在嘗試做的,一個好的解決辦法是以下幾點:

@Component 
public class MainBean { 

    @Autowired 
    private MyTaskFactory myTaskFactory 

    @Autowired 
    private TaskScheduler taskScheduler 


    public void start() { 

     String str = "Print something to console"; 

     taskScheduler.execute(myTaskFactory.getTask(str)); 

    } 
} 


public class MyTaskFactory { 

    public MyTask getTask(String str) { 
     return new MyTask(str); 
    } 
} 

@Configuration 
public class MyTaskFactoryConfig { 

    @Bean 
    public MyTaskFactory myTaskFactory() { 
     return new MyTaskFactory(); 
    } 
} 

注意MyTask將被更改爲:

public class MyTask implements Runnable { 

    private String str; 

    public MyTask(String str) { 
     this.str = str; 
    } 

    @Override 
    public void run() { 

     System.out.println(str); 
    } 
} 
+0

看起來像一個很好的解決方案,但如果我想要在MyTask中注入@Autowired依賴項呢? – ChrisGeo

+0

通過將依賴項注入到MyTaskFactoryConfig中,然後使用工廠的構造函數將其傳遞給MyTaskFactory,然後使用它的構造函數將其傳遞給MyTask,可以輕鬆地處理這種情況。是否清楚或者是否希望我用一些代碼更新答案? – geoand

+0

好的,謝謝你的詳細解釋 – ChrisGeo

0

從註釋中可以看出,您已將MyTask配置爲由Spring管理。另外,str屬性是Spring管理的,它應該被Spring注入到MyTask

因此,無論何時您需要MyTask實例,您都不會自己創建它。

@Autowire無論你需要什麼。

public class ClassThatNeedsMyTaskInstances{ 
    @Autowired 
    MyTask myTask; 
} 

但要注意,默認情況下,MyTask將是一個單身,所以你可能希望將範圍更改爲prototype

但是,如果您不讓Spring管理生命週期,這可能是一個好例子。相反,你用new,或工廠創建實例的管理它自己

+0

製作只是'MyTask'一如果'MainBean'是一個單例,原型不會有任何好處。生命週期不匹配可以通過查找方法處理,但它們似乎已經失去了註解驅動配置的青睞。 –

0

下面的例子是從注入的字符串和XML和基於Java的配置:

XML

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 


    <bean id="MyTaskConstructor" class="java.lang.String"> 
     <constructor-arg type="char[]" value="My value"></constructor-arg> 
    </bean> 
    <bean id="myTask" class="com.package.MyTask"> 
     <constructor-arg ref="MyTaskConstructor"/> 
    </bean> 
</beans> 

基於Java的

@Configuration 
public class MyTaskConfig { 

    @Bean 
    public String getMyTaskConstructor() { 
     return "My value"; 
    } 

    @Bean 
    public MyTask myTask() { 
     return new MyTask(getMyTaskConstructor()); 
    } 
}