Spring静态变量/构造函数注入失败的解决方案
1、案例1:Spring对静态变量的注入为空
案例代码如下:
@Component
public class HelloWorld {
@Value("${hello.world}")
public static String HELLO_WORLD;
}
解决方案一:@Value
注解加在setter方法上面
@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
注解修饰的方法加在顺序在构造方法之后静态变量赋值之前,所以可以通过该注解解决静态变量属性值注入失败问题:
@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()去实现这个需求,但是这会导致一些错误异常,请看下面的示例。
错误演示代码如下:
@Component
public class HelloWorld {
@Autowired
private UserService userService;
public HelloWorld(){
// 这里会报空指针异常:因为 userService 的属性注入是在无参数构造函数之后,如果这里直接使用 userService ,此时该属性值为null,一个为null的成员变量调用sayHello()方法,NullPointException 异常是情理之中呀!
userService.sayHello("hello tiandai!");
}
}
解决方案:@PostConstruct
注解
由于@PostConstruct
注解修饰的方法其生命周期位于构造方法调用之后,在Spring属性值注入之前,所以,该注解可以很好的解决这个业务需求,代码如下:
@Component
public class HelloWorld {
@Autowired
private UserService userService;
public HelloWorld(){
}
@PostConstruct
public void init(){
userService.sayHello("hello tiandai!");
}
}
补充
关于这一部分问题,还有一些奇奇怪怪的用法
在构造函数里使用@Value注入的属性值获取不到
在配置mqtt连接的时候是在bean初始化的时候就进行连接, 所以要配置连接参数, 当时用的是这样的方式.
结果运行的时候一直会报NullPointer异常,网上找了很多方案都没效果, 后来发现 controller里是可以注入成功的, 那么说明依赖注入是在构造函数之后进行的. 用以下方式可解决.
还有一点 , @Value 属性是不可以static修饰的,否则也取不到值。
到此这篇关于Spring 静态变量/构造函数注入失败的解决方案的文章就介绍到这了,更多相关Spring 静态变量 构造函数注入失败内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341