• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
我曾溪底杀指玄
博客园    首页    新随笔    联系   管理    订阅  订阅

JAVA代码执行顺序的实验

项目过程中对Spring @Value注入和静态变量加载的执行顺序比较好奇,故做了实验,这里采用的是一个很有趣的类-ApplicationContextAware的实现类,因为其中有一个方法

setApplicationContext,会在构造方法后自动执行,方便输出结果。

代码如下:@Component

public class AppCtxUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
private static String value = "静态变量";
@Value("${component.val}")
private String UFaceUrl;

static {
System.out.println("静态代码块开始执行");
System.out.println("value = " + value);
System.out.println("静态代码块开始结束");
}

{
System.out.println("构造代码块");
}
public AppCtxUtil() {
System.out.println("构造方法开始执行");
System.out.println("UFaceUrl = " + UFaceUrl);
System.out.println("构造方法开始结束");
}

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
System.out.println("执行set方法");
System.out.println("UFaceUrl = " + UFaceUrl);
}

public static <T> T getBean(String name, Class<T> clzz) throws BeansException {
return (T) applicationContext.getBean(name, clzz);
}

public static ApplicationContext getApplicationContext() {
return applicationContext;
}
}

启动后,经Spring Bean加载后,输出如下:

静态代码块开始执行
value = 静态变量
静态代码块开始结束
构造代码块
构造方法开始执行
UFaceUrl = null
构造方法开始结束
执行set方法
UFaceUrl = abcdefg

 

故得出结论:

静态变量/方法块 > 构造代码块 > 构造方法 > 注解注入值
注意:静态变量/代码块只有初始化的时候才会加载一次,后续不加载

posted @ 2021-05-18 20:30  我曾溪底杀指玄  阅读(198)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3