首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >踩坑:Spring静态变量/构造函数注入失败(注入为null)问题的解决方案

踩坑:Spring静态变量/构造函数注入失败(注入为null)问题的解决方案

作者头像
玖柒的小窝
发布2021-12-11 23:24:26
发布2021-12-11 23:24:26
1.9K0
举报
文章被收录于专栏:各类技术文章~各类技术文章~

1、案例1:Spring对静态变量的注入为空

案例代码如下:

代码语言:javascript
复制
@Component
public class HelloWorld {
   /**
    * 错误案例:这种方式是不能给静态变量注入属性值的
    */
    @Value("${hello.world}")
    public static String HELLO_WORLD;
}
复制代码

解决方案一:@Value注解加在setter方法上面

代码语言:javascript
复制
@Component
public class HelloWorld {
    public static String HELLO_WORLD;
    
    @Value("${hello.world}")
    public void setHELLO_WORLD(String HELLO_WORLD) {
        this.HELLO_WORLD = HELLO_WORLD;
    } 
}
复制代码

解决方案二:@PostConstruct注解

因为@PostConstruct注解修饰的方法加在顺序在构造方法之后静态变量赋值之前,所以可以通过该注解解决静态变量属性值注入失败问题:

代码语言:javascript
复制
@Component
public class HelloWorld {
    public static String HELLO_WORLD;
  
    @Value("${hello.world}")
    public static String helloWorld;
    
    @PostConstruct
    public void init(){
        // 为静态变量赋值(值为从Spring IOC容器中获取的hello.world字段值)
        HELLO_WORLD = this.helloWorld;
    } 
}
复制代码

2、案例2:在构造函数中使用Spring容器中的Bean对象,得到的结果为空

业务场景假设:

eg:我需要在一个类(HelloWorld)被加载的时候,调用service层的接口(UserService)去执行一个方法(sayHello),有些同学可能会在构造函数中通过调用UserService的sayHello()去实现这个需求,但是这会导致一些错误异常,请看下面的示例。

错误演示代码如下:

代码语言:javascript
复制
@Component
public class HelloWorld {
     
   /**
    * UserService注入
    */
    @Autowired
    private UserService userService;

    public HelloWorld(){
       // 这里会报空指针异常:因为 userService 的属性注入是在无参数构造函数之后,如果这里直接使用 userService ,此时该属性值为null,一个为null的成员变量调用sayHello()方法,NullPointException 异常是情理之中呀!
       userService.sayHello("hello tiandai!");
    }
}
复制代码

解决方案:@PostConstruct注解

由于@PostConstruct注解修饰的方法其生命周期位于构造方法调用之后,在Spring属性值注入之前,所以,该注解可以很好的解决这个业务需求,代码如下:

代码语言:javascript
复制
@Component
public class HelloWorld {
     
   /**
    * UserService注入
    */
    @Autowired
    private UserService userService;

    public HelloWorld(){
    }
  
    @PostConstruct
    public void init(){
       userService.sayHello("hello tiandai!");
    } 
}
复制代码

关于这一部分问题,还有一些奇奇怪怪的用法,参考文章:blog.csdn.net/dream199903…

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、案例1:Spring对静态变量的注入为空
  • 2、案例2:在构造函数中使用Spring容器中的Bean对象,得到的结果为空
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档