springboot 静态方法中使用@Autowired注入方式
静态方法使用@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; } }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
解决spring cloud服务启动之后回到命令行会自动挂掉问题
这篇文章主要介绍了解决spring cloud服务启动之后回到命令行会自动挂掉问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-09-09Springboot整合Shiro实现登录与权限校验详细解读
本文给大家介绍Springboot整合Shiro的基本使用,Apache Shiro是Java的一个安全框架,Shiro本身无法知道所持有令牌的用户是否合法,我们将整合Shiro实现登录与权限的验证2022-04-04Java实现Timer的定时调度函数schedule的四种用法
本文主要介绍了Java实现Timer的定时调度函数schedule的四种用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2023-04-04Java自带的Http Server实现设置返回值的类型(content-type)
这篇文章主要介绍了Java自带的Http Server实现设置返回值的类型(content-type),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-11-11
最新评论