zoukankan      html  css  js  c++  java
  • Spring|@Autowired与new的区别

    前两天写代码的时候遇到一个问题,通过new出来的对象,自动注入的属性总是报空指针的错误。到网上查了资料,才发现问题所在,同时也加深了自己对于容器IOC的理解。现在把这个问题记录一下,仅供大家参考。

    【示例】

    package com.example.SpringBootStudy.controller;
    
    import com.example.SpringBootStudy.service.TestService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @Author jyy
     * @Description {}
     * @Date 2018/12/19 18:28
     */
    @RestController
    @RequestMapping(value = "/test")
    public class TestController {
    
        @Autowired
        private TestService testService;
    
        @RequestMapping(value = "/print",method = RequestMethod.GET)
        public void test() {
            testService.test();
        }
    }
    package com.example.SpringBootStudy.service;
    
    import com.example.SpringBootStudy.dao.TestDao;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    /**
     * @Author jyy
     * @Description {}
     * @Date 2018/12/19 18:26
     */
    @Service
    public class TestService {
    
        @Autowired
        private TestDao testDao;
    
        public void test() {
            testDao.test();
        }
    }
    package com.example.SpringBootStudy.dao;
    
    import org.springframework.stereotype.Repository;
    
    /**
     * @Author jyy
     * @Description {}
     * @Date 2018/12/19 18:26
     */
    @Repository
    public class TestDao {
    
        public void test() {
            System.out.println("调用成功!");
        }
    }

    输出结果:

    调用成功!

    一个很简单的示例,Controller调用Service,Service调用Dao,输出结果。

    我们将Controller中testService初始化的方式改为new,看下效果:

    package com.example.SpringBootStudy.controller;
    
    import com.example.SpringBootStudy.service.TestService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @Author jyy
     * @Description {}
     * @Date 2018/12/19 18:28
     */
    @RestController
    @RequestMapping(value = "/test")
    public class TestController {
    
        //@Autowired
        //private TestService testService;
        private TestService testService = new TestService();
    
        @RequestMapping(value = "/print", method = RequestMethod.GET)
        public void test() {
            testService.test();
        }
    }

    输出结果:

    报出空指针异常,跟踪发现Service中的testDao未正确赋值

    总结:@Autowired是从IOC容器中获取已经初始化的对象,此对象中@Autowired的属性也已经通过容器完成了注入,整个生命周期都交由容器管控。然而通过new出来的对象,生命周期不受容器管控,自然也无法完成属性的自动注入。

             

              

  • 相关阅读:
    新浪微博热门话题(30 分)(字符串)
    新浪微博热门话题(30 分)(字符串)
    任务调度的合理性 (25)拓扑排序
    任务调度的合理性 (25)拓扑排序
    PTA 银行排队问题之单队列多窗口服务(25 分)
    PTA 银行排队问题之单队列多窗口服务(25 分)
    PTA 畅通工程之最低成本建设问题(30 分)(最小生成树 krusal)
    PTA 畅通工程之最低成本建设问题(30 分)(最小生成树 krusal)
    PTA 最大子列和问题(10 分)
    PTA 是否同一棵二叉搜索树(25 分)
  • 原文地址:https://www.cnblogs.com/maikucha/p/10145169.html
Copyright © 2011-2022 走看看