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出来的对象,生命周期不受容器管控,自然也无法完成属性的自动注入。

             

              

  • 相关阅读:
    母版
    扣点计算
    付费推广的投入产出比达到多少才合理?
    关于京东POP和采销双平台选择合作
    学习Swift--枚举的初步认识 --个人备忘 大神勿喷
    前台操作及技巧的一些文档
    ABAP 四舍五入函数
    设置ALV 行颜色
    初学笔记
    模块 BAPI
  • 原文地址:https://www.cnblogs.com/maikucha/p/10145169.html
Copyright © 2011-2022 走看看