首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@调度组件的@Bean配置

@调度组件的@Bean配置
EN

Stack Overflow用户
提问于 2017-03-24 13:08:39
回答 2查看 1.8K关注 0票数 1

第一次看Spring --我还有一个关于bean配置的问题,我也想安排一下。使用Spring,我创建了一个应用程序类和一个TaskClass,我希望使用一个配置类来调度和配置这个类。

应用类

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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类

代码语言:javascript
复制
@Configuration
public class AppConfig {
  @Bean
  public TaskClass taskClass(){
    TaskClass task = new TaskClass();
    task.setName("SpringTask");
    return task;
  }
}

来自Scheduler和AppConfig类的实例化对象自然不是same...but,有方法配置调度对象吗?

弹簧调度参考的角度来看,它似乎可以用于XML?但是,如果我想使用Java配置类来实现它呢?

EN

回答 2

Stack Overflow用户

发布于 2017-03-24 13:26:18

如果要设置的值是常量,则可以将其放入application.properties文件中,并将其注入调度程序bean中直接使用@值注释。

application.properties

代码语言:javascript
复制
task.name=SpringTask

TaskClass

代码语言:javascript
复制
@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
EN

Stack Overflow用户

发布于 2017-03-24 13:26:37

在同一个spring ref 链接中,您可以阅读以下内容:

确保在用@Configurable注释并与容器一起注册为常规Spring的bean类上不使用@Configurable,否则将获得双重初始化,一次通过容器,一次通过方面

您可以做的就是使用@PostConstruct方法(在创建bean之后只调用一次)在您的TaskClass中设置taskName,如下所示,然后不需要您的AppConfig类:

代码语言:javascript
复制
    @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}
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43000337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档