Java @Value注入、静态变量、静态代码块执行顺序

项目过程中对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

故得出结论:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值