第一次看Spring - 我有一个关于bean配置的问题,我也想安排。 使用Spring Boot,我创建了一个Application类,以及一个我想要使用配置类进行调度和配置的TaskClass。
申请类
@SpringBootApplication
@EnableScheduling
@ComponentScan("mmmi.pdws.cetrea")
public class Application {
public static void main(String[] args) {
SpringApplication.run(PdwsBackend.class, args); //Leftover from Boot project
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
taskClass task = ctx.getBean(taskClass.class);
}
}
TaskClass
@Component
public class TaskClass {
private String taskName;
@Scheduled(fixedRate=1000)
public void lifeSign(){
System.out.println("My name is " + taskName);
}
public void setName(String name){this.name = name}
}
AppConfig类
@Configuration
public class AppConfig {
@Bean
public TaskClass taskClass(){
TaskClass task = new TaskClass();
task.setName("SpringTask");
return task;
}
}
来自Scheduler和AppConfig类的实例化对象自然不一样......但有没有办法配置Scheduled对象?
查看Springs scheduling reference它似乎可以用于XML配置吗?但是如果我想用Java配置类做什么呢?
答案 0 :(得分:0)
如果您要设置的值是常量,则可以将其放在 application.properties 文件中,并将其注入到使用@Value注释直接进入调度程序bean。< / p>
<强> application.properties 强>
task.name=SpringTask
<强> TaskClass 强>
@Component
public class TaskClass {
private final String taskName;
public TaskClass(@Value("${task.name}") String taskName) {
this.taskName = taskName;
}
@Scheduled(fixedRate=1000)
public void lifeSign(){
System.out.println("My name is " + taskName);
}
public void setName(String name){this.name = name}
}
如果您不喜欢构造函数注入,也可以将值直接注入到字段中。
当然AppConfig
中声明的bean是多余的,因为TaskClass
注释了@Component
,@ComponentScan
会找到它。
答案 1 :(得分:0)
从同一个春季参考link,您可以阅读以下内容:
确保不对使用@Configurable
注释的bean类使用@Scheduled
并将其注册为带有容器的常规Spring bean:否则将获得双重初始化,一旦通过容器和一次@Configurable
方面。
你可以做的只是在@PostConstruct
中使用TaskClass
方法(在创建bean之后只调用一次)来设置taskName
,如下所示,然后你就不需要了你的AppConfig
课程:
@Component
public class TaskClass {
private String taskName;
@Postconstruct
public void init() {
taskName= "SpringTask";
}
@Scheduled(fixedRate=1000)
public void lifeSign(){
System.out.println("My name is " + taskName);
}
public void setName(String name){this.name = name}
}