本文针对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 自动调用的方法实现的逻辑 根据自己的实际情况完善代码逻辑