zoukankan      html  css  js  c++  java
  • java 静态代码块和spring @value等注解注入顺序

    java 静态代码块和spring @value等注解注入顺序

    问题所在

    先上代码

    java方法

    @Value("${mf.cashost}")
    public static String casHost;
    
    public static String getCasHost() {
        if (StringUtils.isEmpty(casHost)) {
      //casHost = "http://sso.abc.com.cn/sso/";
            casHost = "http://ssotest.abc.com.cn/sso/";
        }
        return casHost;
    }

    配置文件

    mf.cashost=http://sso.abc.com.cn/sso/

    正常我们想要的getCasHost的值,肯定是sso.abc.com.cn,而不是ssotest,但是如果调用getCasHost肯定是返回test的,或者说,casHost最开始进到getCasHost的方法时,就是空的。

    分析一波

    关于实例变量与构造方法的初始化顺序问题

    1. Java类会先执行构造方法,然后再给注解了@Value 的属性注入值,所以在执行静态代码块的时候,就会为null。
    2. Java 及Spring 初始化顺序:java静态属性/静态代码块(根据声明的先后顺序加载)、构造代码块、 构造方法(即:spring创建FetchStockSchedule的实例 交给Spring 管理)、@Value/@ AutoWired/@Resouce 等注解 的成员变量等赋值。

    解决一下

    解决方案

    1. 首先,让当前类变成Spring的bean,
    2. 再使用@PostConstruct
    @Value("${mf.cashost}")
    private String mfCasHost;
    
    private static String casHost;
    
    @PostConstruct
    public void init() {
        casHost = mfCasHost;
    }
    
    public static String getCasHost() {
        if (StringUtils.isEmpty(casHost)) {
            casHost = "http://ssotest.abc.com.cn/sso/";
        }
        return casHost;
    }

    原理

    Java中该注解的说明:
    @PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。

    通常我们会是在Spring框架中使用到@PostConstruct注解 该注解的方法在整个Bean初始化中的执行顺序:
    此时的执行顺序:

    1. 构造方法
    2. Before Initialization
    3. 使用PostConstruct注解
    4. InitializingBean接口
    5. init-method指定的初始化方法
    6. After Initialization

    <wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

  • 相关阅读:
    内部类
    抽象类与接口
    多态
    继承
    封装
    创建对象的内存分析
    构造器
    面向对象 类与对象
    uniapp跳转
    uniapp-组件引用错误,仅支持 import 方式引入组件
  • 原文地址:https://www.cnblogs.com/pipicai96/p/11718761.html
Copyright © 2011-2022 走看看