静态方法使用@Autowired注入
尧上有农 人气:5静态方法使用@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; /** * 编写Get请求的方法。但没有参数传递的时候,可以使用Get请求 * * @param url 需要请求的URL * @return 将请求URL后返回的数据,转为JSON格式,并return */ 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; } /** * 编写Get请求的方法。但没有参数传递的时候,可以使用Get请求 * * @param url 需要请求的URL * @return 将请求URL后返回的数据,转为JSON格式,并return */ 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; } }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
加载全部内容