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

             

              

  • 相关阅读:
    github常见操作和常见错误!错误提示:fatal: remote origin already exists.
    [vim]vim 在win下乱码解决
    [git]图解git常用命令
    [vim配置]windows下在vim中使用gcc/g++编译调试c/cpp文件
    windows live writer 尝试登陆时发生意外错误,导致无法发表博客解决方案
    win7系统cmd命令切换到指定文件夹目录
    qt中文乱码问题
    免费Flash图表工具FusionChart
    将matlab中数据输出保存为txt或dat格式
    对接支付宝的城市服务(水费)
  • 原文地址:https://www.cnblogs.com/maikucha/p/10145169.html
Copyright © 2011-2022 走看看