静态方法使用@Autowired注入
@Component
public class StructUtil {
private static StructService structService;
private static List<StructInfo> structInfos;
// 通过重写set注入
@Autowired
public void setStructService(StructService structService){
StructUtil.structService = structService;
}
public static List<StructInfo> getStruct(){
if(null==structInfos){
structInfos = structService.getStruct();
}
return structInfos;
}
}
静态方法使用@Autowired注入的类
在写公众号开发的时候,有一个处理get请求,我想使用Spring提供的RestTemplate处理发送;
原来是这样的
@Component
public class WeChatContant {
@Autowired
private RestTemplate restTemplate;
public JSONObject doGerStr(String url) throws IOException {
ResponseEntity responseEntity = restTemplate.getForEntity
(
url,
String.class
);
Object body = responseEntity.getBody();
assert body != null;
JSONObject jsonObject = JSONObject.fromObject(body);
System.out.println(11);
return jsonObject;
}
}
但是到这里的话restTemplate这个值为空,最后导致空指针异常。发生的原因是
static模块会被引入,当class加载后。你的component组件的依赖还没有初始化。
(你的依赖都是null)
解决方法
可以使用@PostConstruct这个注解解决
1,@PostConstruct 注解的方法在加载类的构造函数之后执行,也就是在加载了构造函数之后,为此,可以使用@PostConstruct注解一个方法来完成初始化,@PostConstruct注解的方法将会在依赖注入完成后被自动调用。
2,执行优先级高于非静态的初始化块,它会在类初始化(类加载的初始化阶段)的时候执行一次,执行完成便销毁,它仅能初始化类变量,即static修饰的数据成员。
自己理解的意思就是在component组件都加载完之后再加载
修改过后的代码如下
@Component
public class WeChatContant {
@Autowired
private RestTemplate restTemplate;
private static RestTemplate restTemplateemp;
@PostConstruct
public void init(){
restTemplateemp = restTemplate;
}
public static JSONObject doGerStr(String url) throws IOException {
ResponseEntity responseEntity = restTemplateemp.getForEntity
(
url,
String.class
);
Object body = responseEntity.getBody();
assert body != null;
JSONObject jsonObject = JSONObject.fromObject(body);
System.out.println(11);
return jsonObject;
}
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。