这篇文章描述了Spring整体的启动流程,并通过测试用例,演示了一些Spring的扩展点在Bean的生命周期中的使用。

测试代码

@Component
public class A implements SmartLifecycle {
private boolean running;

@Override
public void start() {
System.out.println("SmartLifecycle start...");
this.running = true;
}

@Override
public void stop() {
System.out.println("SmartLifecycle stop...");
}

@Override
public boolean isRunning() {
System.out.println("SmartLifecycle isRunning...");
return this.running;
}
}

public class B implements InitializingBean {

@PostConstruct
public void postConstruct() {
System.out.println("PostConstruct ...");
}

@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet ...");
}

public void init() {
System.out.println("init method ...");
}

@PreDestroy
public void preDestroy() {
System.out.println("PreDestroy ...");
}

public void destroy() {
System.out.println("destroy method ...");
}
}

@Component
@EnableAsync
public class C {

@Async
public void print() {
for (int i = 0; i < 10; i++) {
System.out.println("test ...");
}
}
}

@Configuration
@ComponentScan("com.francis.test")
public class JavaConfig {

@Bean(initMethod = "init", destroyMethod = "destroy")
public B b() {
return new B();
}

@Bean
public TaskExecutor taskExecutor() {
return new ThreadPoolTaskExecutor();
}
}

public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(JavaConfig.class);
applicationContext.getBean(C.class).print();
System.out.println("在调用 com.francis.test.C.print() 之前打印这句话说明异步生效,否则是同步");
applicationContext.close();
}
}

整体流程

一张图搞懂Spring启动流程和Bean的生命周期_ide