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

             

              

  • 相关阅读:
    UWP中实现大爆炸效果(二)
    UWP中实现大爆炸效果(一)
    c# 【电影搜索引擎】采集电影站源码
    安利一个聚合搜索导航站,及怎么样设置成默认的搜索引擎
    女朋友经常问影视剧, 答不上来怎么办?
    宝塔linux面板, 服务器日志分析与流量统计这款插件的mysql版优化。
    苹果cms自动采集,重复执行遇到“上次执行时间: --跳过”的解决办法
    苹果cms, 后台设置保存不了的解决办法
    解决 C:WINDOWSsystem32inetsrv ewrite.dll 未能加载。返回的数据为错误.
    img error 图片加载失败的最佳方案
  • 原文地址:https://www.cnblogs.com/maikucha/p/10145169.html
Copyright © 2011-2022 走看看