2017-03-24 10 views
1

初めてSpringを見ていて、私もスケジュールしたいBeanの設定に関する質問があります。 Springブートを使用して、構成クラスを使用してスケジュールし構成することをお勧めするApplicationクラスとTaskClassを作成しました。@スケジューリングされたコンポーネントの@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} 
} 

あなたはコンストラクタ・インジェクションを好きではない場合にも、フィールドに値を直接注入することができます。 TaskClass@Componentと注釈されていると@ComponentScanによって発見されるので

もちろんAppConfigで宣言されたBeanは冗長です。同じ春refのlinkから

0

、あなたは以下を読むことができます:

あなたは@Scheduledで注釈さとコンテナとの定期的なのSpring Beanとして登録されているBeanクラスに@Configurableを使用していないことを確認してください:あなたが希望それ以外の場合はコンテナを1回、@Configurableのアスペクトを経由してダブル初期化を取得します。あなたは何ができるか

は、単に、以下に示すようtaskNameを設定し、その後、あなたのAppConfigクラスを必要としない、あなたのTaskClassに(豆の作成後に一度だけ呼ばれる)@PostConstructメソッドを使用している:

@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} 
    } 
関連する問題