问题描述
开发过程中需要将类注入到另一个类的静态变量中,一开始写法如下所示:
@Component
public class Test{
@Autowired
private static UserLogin userLogin;
public static boolean print(){
return userLogin.login();
}
}
上面这种情况,在调用user对象时会报NullPointerException
,因为UserLogin
对象并没有注入进来。为什么呢?因为静态变量并不属于对象的属性,而是属于类的属性,而Spring则是基于对象的属性进行依赖注入的,所以这样做肯定不行。
问题解决
为了能够让User对象不为空,最先想到的是在Spring实例化Test类时,对UserLogin
对象进行赋值,修改如下:
@Component
public class Test{
private static UserLogin userLogin;
@PostConstruct
public void init(){
Test.userLogin = new UserLogin();
}
public static boolean login(){
return userLogin.login();
}
}
编写一个方法init()
,并标注注解@PostConstruct
,意思就是在完成构造函数实例化后就调用该方法,该方法会对UserLogin
对象实例化。
但是执行login()
方法后,会报UserLogin
对象里的User
对象为空,原来UserLogin对象里的User对象也是注入的:
public class UserLogin{
@Autowired
private User user;
}
但是在Test类里却是用的new UserLogin()来实例化的,导致脱离了Spring的管理,怎么解决该问题呢?想到既然可以在init方法里实例化,那么也可以引用注入的类了,因此修改如下:
@Component
public class Test{
@Autowired
private UserLogin _userLogin;
private static UserLogin userLogin;
@PostConstruct
public void init(){
Test.userLogin = _userLogin;
}
public static boolean login(){
return userLogin.login();
}
}
至此,问题解决。