Spring DI与构造函数

时间:2014-04-12 10:44:30

标签: java spring constructor

我有以下代码:

@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参数传递给构造函数。我怎样才能做到这一点?我无法在任何地方找到任何好的例子。

3 个答案:

答案 0 :(得分: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);
    }
} 

答案 1 :(得分:0)

从注释中可以看出,您已将MyTask配置为Spring管理。此外,str属性是Spring管理的,它应该由Spring注入MyTask

因此,只要您需要MyTask个实例,就不能自己创建。

@Autowire,无论您需要什么地方。

public class ClassThatNeedsMyTaskInstances{
    @Autowired
    MyTask myTask;
}

但请注意,默认情况下,MyTask将是单身,因此您可能希望将其范围更改为prototype

但这可能是一个很好的例子,你不能让Spring管理MyTask的生命周期。相反,您可以通过使用new或工厂

创建实例来自行管理

答案 2 :(得分: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());
    }
}