@PostConstruct这个注解是由Java提供的,而不是spring提供的,它用来修饰一个非静态的void方法。它会在服务器加载Servlet的时候运行,并且只运行一次。bean创建完成空对象,就开始进行@Autowire、@PostConstruct赋值。
@Component
public class SystemConstant {
public static String surroundings;
@Value("${spring.profiles.active}")
public String environment;
@PostConstruct
public void initialize() {
System.out.println("初始化环境...");
surroundings = this.environment;
}
}
执行顺序:
第一种:当直接调用(没有new对象)静态方法时候:代码块(静态变量按照顺序)就执行—–方法执行。
第二种创建对象:执行父类静态代码—-执行子类的静态代码—-执行父类构造方法—–执行子类的构造方法(注:@PostConstruct修饰的方法是在构造方法之后执行的)
注:静态变量和静态代码块都是按照代码书写顺序执行的,对于静态代码块只要是操作(调用静态方法或者新建一个类等)这个类就会执行(包括静态变量)
静态变量也可以用value注解进行注入,只要将注解放在变量的set方法上即可,且方法不可为静态方法
@Component
public class SystemConstant {
public static String surroundings;
@Value("${spring.profiles.active}")
public String environment;
@Value("${spring.profiles.active}")
public void setSurroundings(String surroundings ){
SystemConstant.surroundings = surroundings;
// 这里一定要加入一段执行代码什么都可以 否则注入失败
// 当你要使用其他静态变量时也要在这里赋值
}
}
@Component
public class PathConstant {
private static String prefix;
@Value("${constant.file-path.prefix}")
public void setPrefix(String prefix) {
PathConstant.prefix = prefix;
PathConstant.VIDEO_PATH = prefix +"/media/video";
PathConstant.PAPER_INTERPRET_HTML_PATH = prefix +"/html/paper_interpret/";
PathConstant.PAPER_INTERPRET_IMG_PATH = prefix +"/img/paper_interpret/";
}
/**
* 首页视频文件路径
*/
public static String VIDEO_PATH;
/**
* 论文解读html路径
*/
public static String PAPER_INTERPRET_HTML_PATH;
/**
* 论文解读图片路径
*/
public static String PAPER_INTERPRET_IMG_PATH;
}
关于spring初始化操作
实现ApplicationRunner接口,然后Override这个ApplicationRunner接口的run方法即可