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

             

              

  • 相关阅读:
    ACM ICPC 2008–2009 NEERC MSC A, B, C, G, L
    POJ 1088 滑雪 DP
    UVA 11584 最短回文串划分 DP
    POJ 2531 Network Saboteur DFS+剪枝
    UVa 10739 String to Palindrome 字符串dp
    UVa 11151 Longest Palindrome 字符串dp
    UVa 10154 Weights and Measures dp 降维
    UVa 10271 Chopsticks dp
    UVa 10617 Again Palindrome 字符串dp
    UVa 10651 Pebble Solitaire 状态压缩 dp
  • 原文地址:https://www.cnblogs.com/maikucha/p/10145169.html
Copyright © 2011-2022 走看看