@Scheduled组件的@Bean配置

时间:2017-03-24 13:08:40

标签: spring spring-boot

第一次看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配置类做什么呢?

2 个答案:

答案 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}
    }