我有以下代码:
@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参数传递给构造函数。我怎样才能做到这一点?我无法在任何地方找到任何好的例子。
答案 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());
}
}