资讯专栏INFORMATION COLUMN

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

cpupro / 2729人阅读

摘要:案例对静态变量的注入为空案例代码如下错误案例这种方式是不能给静态变量注入属性值的解决方案一注解加在方法上面解决方案二注解因为注解修饰的方法加在顺序在构造方法之后静态变量赋值之前,所

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

案例代码如下:

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

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

@Componentpublic class HelloWorld {    public static String HELLO_WORLD;        @Value("${hello.world}")    public void setHELLO_WORLD(String HELLO_WORLD) {        this.HELLO_WORLD = HELLO_WORLD;    } }

解决方案二:@PostConstruct注解

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

@Componentpublic 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()去实现这个需求,但是这会导致一些错误异常,请看下面的示例。

错误演示代码如下:

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

解决方案:@PostConstruct注解

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

@Componentpublic class HelloWorld {        /**    * UserService注入    */    @Autowired    private UserService userService;    public HelloWorld(){    }      @PostConstruct    public void init(){       userService.sayHello("hello tiandai!");    } }

关于这一部分问题,还有一些奇奇怪怪的用法,参考文章:https://blog.csdn.net/dream19990329/article/details/106274283

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/124768.html

相关文章

  • Spring入门看这一篇就够了

    摘要:甲乙交易活动不需要双方见面,避免了双方的互不信任造成交易失败的问题。这就是的核心思想。统一配置,便于修改。带参数的构造函数创建对象首先,就要提供带参数的构造函数接下来,关键是怎么配置文件了。 前言 前面已经学习了Struts2和Hibernate框架了。接下来学习的是Spring框架...本博文主要是引入Spring框架... Spring介绍 Spring诞生: 创建Spring的...

    superw 评论0 收藏0
  • 神兵利器Dagger2

    摘要:方案我们手动以构造函数的方式注入依赖,将和作为参数传入而不是在的构造函数中去显示的创建。同样我们需要在类的成员变量上加上表示自己需要为自己提供依赖类的构造函数上的也需要去掉,应为现在不需要通过构造函数上的来提供依赖了。 Dagger-匕首,鼎鼎大名的Square公司旗下又一把利刃(没错!还有一把黄油刀,唤作ButterKnife);故此给本篇取名神兵利器Dagger2。 Dagger2...

    _DangJin 评论0 收藏0
  • spring实现静态注入(类或者属性)

    摘要:实现静态注入类或者属性场景是工具类一般都是静态方法,静态方法只能访问静态属性。所以,我们需要静态注入类或者属性。常规操作注入类或者方法这样,我们就把容器里的类和里的值注进去了。 [spring实现静态注入(类或者属性)]() 场景是:工具类一般都是静态方法,静态方法只能访问静态属性。所以,我们需要静态注入类或者属性。 常规操作: 注入类或者方法: @Autowired private ...

    468122151 评论0 收藏0
  • Spring详解3.Bean装配

    摘要:的依赖关系,根据依赖关系配置完成之间的装配。的行为信息,如生命周期范围及生命周期各过程的回调函数。使用该种装配模式时,优先匹配参数最多的构造函数。如果提供了默认的构造函数,则采用否则采用进行自动装配。 点击进入我的博客 1 Spring容器与Bean配置信息 Bean配置信息 Bean配置信息是Bean的元数据信息,它由一下4个方面组成: Bean的实现类 Bean的属性信息,如数...

    endiat 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<