CommandLineRunner接口和@PostConstruct

CommandLineRunner接口

CommandLineRunner接口是Spring Boot框架提供的一个接口,用于在Spring Boot应用程序启动后执行一些代码。它只有一个方法:run(String… args),该方法在应用程序启动时被调用。

实现CommandLineRunner接口的类可以被Spring Boot自动识别并在应用程序启动时执行。这个接口通常用于执行一些初始化操作,例如加载数据、初始化缓存、创建线程池等等。

在实现CommandLineRunner接口的类中,可以使用@Autowired注解来注入其他的Bean,从而实现更复杂的初始化操作。

例如:

@Component
public class MyCommandLineRunner implements CommandLineRunner {

    @Autowired
    private MyService myService;

    @Override
    public void run(String... args) throws Exception {
        // 初始化操作
        myService.init();
    }
}

在上面的例子中,MyCommandLineRunner类实现了CommandLineRunner接口,并注入了MyService类。在run方法中,调用了MyService的init方法来进行一些初始化操作。

需要注意的是,实现CommandLineRunner接口的类会在Spring Boot应用程序启动时被执行,因此如果初始化操作比较耗时,可能会影响应用程序的启动时间。


CommandLineRunner接口的执行时机和次数

CommandLineRunner是Spring Boot框架提供的一个接口,用于在Spring Boot应用程序启动时运行一些额外的代码。它有一个run方法,可以在应用程序启动后执行一些逻辑。

CommandLineRunner接口的执行时机是在Spring Boot应用程序启动完成后,Spring Boot应用程序上下文创建完成后执行。也就是说,当Spring Boot应用程序启动时,它会扫描所有实现CommandLineRunner接口的类,并在应用程序上下文创建完成后执行它们的run方法。

CommandLineRunner接口的执行次数是一次。也就是说,每个实现CommandLineRunner接口的类只会在应用程序启动时执行一次run方法。如果需要在应用程序运行过程中执行某些逻辑,可以使用ApplicationRunner接口。与CommandLineRunner接口类似,ApplicationRunner接口也提供了一个run方法,但是它的执行时机是在Spring Boot应用程序启动完成后,Spring Boot应用程序上下文创建完成后,并且所有CommandLineRunner接口的实现类都已经执行完毕后执行。


@PostConstruct

PostConstruct注解是Java EE 5规范中引入的注解之一,它可以被用来标注一个方法,该方法会在依赖注入完成后立即被调用,完成一些初始化操作。具体来说,当容器实例化Bean并完成依赖注入后,容器会在调用构造函数之后立即调用被@PostConstruct注解标注的方法。

使用@PostConstruct注解的方法必须满足以下条件:

  1. 方法名任意;
  2. 方法不应该有任何参数;
  3. 方法的访问修饰符不能是private、static、final等。

使用@PostConstruct注解的方法可以用来初始化Bean的状态,例如建立数据库连接、初始化缓存等。需要注意的是,如果在Bean中同时使用了@PostConstruct和@PreDestroy注解,则@PostConstruct注解的方法会在@PreDestroy注解的方法之前被调用。

总之,使用@PostConstruct注解可以方便地在Bean实例化和依赖注入完成后执行一些初始化操作,从而提高Bean的可用性和可靠性。

PostConstruct注解是javax.annotation包中的一个注解,用于标注一个方法,该方法会在依赖注入完成后,初始化之前被调用。它可以用来执行一些初始化操作,例如初始化一些资源或者进行一些检查。

下面是一个使用PostConstruct注解的示例代码:

import javax.annotation.PostConstruct;

public class UserService {

    private UserDao userDao;

    @PostConstruct
    public void init() {
        userDao = new UserDao();
        userDao.init();
    }

    // other methods
}

在上面的代码中,UserService类中使用了PostConstruct注解标注了一个名为init()的方法。当UserService类被实例化并完成依赖注入之后,init()方法会被自动调用,用于初始化userDao对象。


PostConstruct注解的执行时机和CommandLineRunner接口的run方法,哪个先执行

在Spring中,当一个Bean被实例化并注入所有依赖之后,会按照以下顺序执行一些生命周期回调方法:

  1. 执行构造函数
  2. 执行依赖注入
  3. 执行@PostConstruct注解的方法
  4. 执行实现了CommandLineRunner接口的run方法

因此,@PostConstruct注解的方法会先于实现了CommandLineRunner接口的run方法执行。@PostConstruct注解的方法会在依赖注入完成之后立即执行,而CommandLineRunner接口的run方法则是在所有Bean都被初始化之后才会执行。

你可能感兴趣的:(java,开发语言)