当我必须在spring boot中安排任务时,为什么需要添加@Component

时间:2017-11-20 08:39:50

标签: spring-boot

我没有理解正确使用@Componenet,@ Configuration,@ Bean注释。 我想每60秒运行一个方法。请检查以下代码。如果我不给@Component注释,那么它就不会运行。那么在这种情况下@Component的用途是什么?

MyPolls

1 个答案:

答案 0 :(得分:0)

这段代码有几个问题:

  1. 您的Spring Boot应用程序未标记为@SpringBootApplication(或@EnableAutoConfiguration)。因此,自动配置根本不会启动(Spring Boot将启动您的应用程序,但除了基本的东西,如env准备等,它将不会对它做任何事情)。在某些情况下它完全没问题,但这可能不是你想要的
  2. 您已直接在应用上标记了运行任务。它可以用于演示,但最好将该逻辑移到自己的类中
  3. 所以回答你的问题:SchedulingProjectApplication是你应用的根源,但它只是一个简单的POJO。没有任何东西可以指示容器处理它。通常应用程序是@Configuration(您可以使用其中一个@EnableXYZ,您可以定义其他bean等。

    如果您在课程中添加@SpringBootApplication,它会扫描您应用的相同包中的所有@Component(以及所有子包)。

    有关代码结构in the documentation

    的更多详细信息

    一个基本/简单的结构是:

    package com.example.foo;
    
    @SpringBootApplication
    @EnableScheduling
    public class SchedulingProjectApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SchedulingProjectApplication.class, args);
        }
    
    }
    

    package com.example.foo;
    
    @Component
    public class SchedulingLogger {
    
        private static final Logger log = 
                LoggerFactory.getLogger(SchedulingLogger.class);
    
        @Scheduled(fixedDelay = 6000)
        public void r()
        {
            log.info("Start- main-job");
            log.info("stop-main-job");
        }
    }
    

    关于配置,您应该注意其他一些事项(例如moving decisions outside of your @SpringBootApplication if you use slicing)。