springboot 启动后自动调用方法-功能实现
2021-11-24 本文已影响0人
初心myp
本文针对Springboot项目中,有些功能方法需要在项目启动成功之后自动调用该方法,已达到项目启动后初始化数据、启动对应的服务方法等目的
第一种方案
通过写一个配置类和@PostConstruct
注解实现,主要就是项目启动成功后,会自动加载调用@PostConstruct
修饰的方法,以此达到方法自动执行的目的
主要实现代码:
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class AutoStartConsumer {
@Value("${kafka.consumer.topic.groupId:}")
private String groupId;
@Autowired
private TestService testService;
@PostConstruct
public void TestAutoStart() throws Exception {
// todo 实现方法逻辑 也可以注入其他业务接口类实现功能调用及实现
}
}
因为上面的类是一个配置类,所以功能需要的接口类、manager类、@Value获取值等功能都是可以正常使用的
注:如果调用的业务类中方法逻辑包含死循环的情况,上述方法实现的自动调用功能就存在一定的问题,因为存在死循环的情况下,服务启动成功之后,死循环中方法可以自动调用,但是,请酌情使用!
为什么调用的方法中会出现死循环的情况:
例1:实现kafka消息订阅的方法,使用while (true) 循环自动监听消息,这就存在了死循环的情况了;
例2:监听socket通讯,所以要一直不断的执行,所以也会使用死循环的方式进行监听
第二种方案
为了解决上述第一种方案的问题,如果服务启动后自动调用的方法中存在死循环的情况如何处理?第二种方案就可以实现。
主要实现:将监听方法写在启动类中,同时实现CommandLineRunner
接口类,实现对应的run
方法
主要代码实现:
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.CommandLineRunner;
@SpringBootApplication
@EnableSwagger2
@ComponentScan(basePackages = {"com.sinochem.it"})
public class MessageApplication implements CommandLineRunner {
// 启动类主方法(不用动)
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(MessageApplication.class, args);
}
// 普通的注解方式注入类、获取值都是可以正常使用的
@Value("${kafka.consumer.topic.groupId:}")
private String groupId;
@Autowired
private TestService testService;
// 服务启动后自动调用的方法
@Override
public void run(String... args) throws Exception {
// todo 自动调用的方法实现的逻辑 根据自己的实际情况完善代码逻辑
testService.test();
}
}
上述方法可以实现服务启动后的自动调用功能,同时也能解决方法中存在死循环的情况下,服务可以正常被访问、定时任务可以正常被扫描。如果方法中不包含死循环,第一种方案就可以达到自动调用的目的!