我在M2公司做架构之系统初始化

系统初始化无论是对于分布式微服务系统还是对于单体服务系统而言都是必不可少的。一个系统的初始化通常涵盖两个方面:

  • 第一个方面是数据初始化;
  • 第二个方面是应用服务启动初始化。

一、数据初始化

数据初始化主要包含:

  • 创建数据库表结构;
  • 初始化数据插入对应的数据表;
  • 创建程序所必要的视图;
  • 创建程序所必要的触发器;
  • 创建程序所必要的事件;
  • 创建程序所必要的存储过程。

而上面六点均以一个或多个xx.sql文件存在,由运维人员在搭建好数据库环境后执行。

二、应用服务启动初始化

不论是单体应用还是微服务应用,初始化都是必不可少的。初始化的场景有很多,例如某些接口数据量过大,初始化的目的在于启动过程中缓存数据,接口直接从缓存中取出,然后对应的定时任务在系统低频使用的时间执行缓存数据更新操作。

Java实现初始化的方式有不少,如下5种可供参考:

  • 使用@PostConstruct注解标记的方法;
  • 实现CommandLineRunner接口并重写run()方法;
  • 实现ApplicationRunner接口并重写run()方法;
  • 实现org.springframework.beans.factory.InitializingBean接口并重写 afterPropertiesSet()方法;
  • 使用ContextRefreshedEvent事件(上下文件刷新事件)。

1.使用@PostConstruct注解标记的方法

1
2
3
4
5
6
7
8
9
10
11
12
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
@Slf4j
public class ExampleConfig {

@PostConstruct
public void init() {
log.info("init......");
}
}

2.实现CommandLineRunner接口并重写run()方法

1
2
3
4
5
6
7
8
9
10
11
12
13
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class ExampleConfig implements CommandLineRunner {

@Override
public void run(String... args) throws Exception {
log.info("init......");
}
}

3.实现ApplicationRunner接口并重写run()方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class ExampleConfig implements ApplicationRunner {


@Override
public void run(ApplicationArguments args) throws Exception {
log.info("init......");
}
}

4.实现org.springframework.beans.factory.InitializingBean接口并重写 afterPropertiesSet()方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.ApplicationArguments;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class ExampleConfig implements InitializingBean {

@Override
public void afterPropertiesSet() throws Exception {
log.info("init......");
}
}

5.使用ContextRefreshedEvent事件(上下文件刷新事件)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class ExampleConfig implements ApplicationListener<ContextRefreshedEvent> {

@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
log.info("init......");
}
}
文章目录
  1. 一、数据初始化
  2. 二、应用服务启动初始化
    1. 1.使用@PostConstruct注解标记的方法
    2. 2.实现CommandLineRunner接口并重写run()方法
    3. 3.实现ApplicationRunner接口并重写run()方法
    4. 4.实现org.springframework.beans.factory.InitializingBean接口并重写 afterPropertiesSet()方法
    5. 5.使用ContextRefreshedEvent事件(上下文件刷新事件)