美文网首页
如何在静态方法中直接使用注入的bean对象

如何在静态方法中直接使用注入的bean对象

作者: 昊家 | 来源:发表于2018-11-22 18:50 被阅读0次

    如何在静态方法中直接使用注入的bean对象

    今天遇到一个问题,就是在静态方法中无法使用@Autowired的对象,然后就搜索了一下,写下这边文章,以做记录:


    问题代码

    @Component

    public class MobileMessageSend {

        @Autowired

        private RedisBaseOperation<String> redisBaseOperation;

    public static int sendMsg(String phone) throws IOException {

            String phoneCode = JSON.parseObject(responseEntity).getString("obj");

            redisBaseOperation.putCode(phone,phoneCode);

            return 0;

    }

    上面的代码运行之后会报错

    Error:(74, 13) java: 无法从静态上下文中引用非静态 变量 redisBaseOperation

    解决方案

    错误的方案

        @Autowired

        private static RedisBaseOperation<String> redisBaseOperation;

        通过注解注入的静态实例变量,取到的值为null

    正确的解决方案

    使用@PostConstruct注解

    @PostConstruct 是从Java EE 规范开始,增加的影响Servlet声明周期的注解。被用来修饰一个非晶态的void方法,

    而被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且智慧被服务器执行一次

    @PostConstruct的执行顺序 在构造函数之后执行后,init()方法之前执行

    修改的代码如下:

    @Component

    public class MobileMessageSend {

        @Autowired

        private RedisBaseOperation<String> redisBaseOperationCode;

        private static MobileMessageSend mobileMessageSend;

        public void setRedisBaseOperation(RedisBaseOperation<String> redisBaseOperation) {

            this.redisBaseOperationCode = redisBaseOperation;

        }

        public static int sendMsg(String phone) throws IOException {

            String phoneCode = JSON.parseObject(responseEntity).getString("obj");

            mobileMessageSend.redisBaseOperation.putCode(phone,phoneCode);

            return 0;

        }

    }

    总结:查看的了很多其他人的文档,发现大都是大同小异,写下这篇文章以备查看

    相关文章

      网友评论

          本文标题:如何在静态方法中直接使用注入的bean对象

          本文链接:https://www.haomeiwen.com/subject/jckrqqtx.html