2017-03-24 66 views
1

第一次查看Spring - 我有一個關於我也想安排的bean配置的問題。 使用Spring Boot,我創建了一個Application類和一個TaskClass,我都希望使用配置類進行調度和配置。@Scheduled組件的@Bean配置

應用類

@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; 
    } 
} 

的instantia調度器和AppConfig類中的ted對象自然不是一樣的......但是有沒有辦法配置Scheduled對象?

看着Springs scheduling reference它似乎可以用XML配置嗎?但是如果我想用Java配置類來做呢?

回答

0

如果要設置的值不變,可以將其放入application.properties文件中,並將其注入直接使用@Value註釋到調度程序bean中。

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找到。

0

從相同的彈簧裁判link,您可以閱讀以下內容:

確保你不被註解爲@Scheduled並註冊爲普通的Spring beans與容器bean類使用@Configurable你會否則獲得雙重初始化,一旦通過容器並且一旦通過@Configurable方面

你可以做的是簡單地使用@PostConstruct方法(bean創建後只調用一次)在TaskClass設置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} 
    }