本文来说下spring容器管理对象和new对象之间的区别与联系

文章目录

  • 流程图说明Spring注入的对象和new的对象区别
    • 普通的创建new对象
    • 交由spring ioc容器进行管理
  • Spring的 IOC 容器比New对象究竟好在哪
  • new 对象里面使用自动注入对象会报空指针异常
  • 本文小结

流程图说明Spring注入的对象和new的对象区别

普通的创建new对象

在获取对象时都是采用new的方式,是属于主动的


交由spring ioc容器进行管理

spring在获取对象时,同时跟工厂要,有工厂就查找或者创建对象,是属于被动的


Spring的 IOC 容器比New对象究竟好在哪

ioc的思想最核心的地方在于,资源不由使用资源的双方管理,而由不使用资源的第三方管理,这可以带来很多好处。

  • 资源集中管理,实现资源的可配置和易管理。
  • 降低了使用资源双方的依赖程度,也就是我们说的耦合度。

IOC思想

java程序中的每个业务逻辑至少需要两个或以上的对象来协作完成,通常,在使用其他的合作对象时,均要使用像new object这样的语法来完成合作对象的申请工作。你会发现:对象间的耦合度高了。而IOC的思想是:Spring容器来实现这些相互依赖对象的创建、协调工作。对象只需要关心业务逻辑本身就可以了。IOC是基于java的反射机制以及工厂模式实现的

Inversion of Control(控制反转)是一种设计思想,就是容器控制应用程序所需要外部资源的创建和管理,然后将其反转给应用程序。对象及其依赖对象的创建及维护都不需要在应用程序中实现,将其交给IOC容器去管理。传统的开发中,我们自己在对象内部创建依赖对象并注入当前对象,完成依赖关系的维护;对于IOC而言,它强调是将主动变为被动,由IOC容器来负责依赖对象的创建和查找,由IOC容器来进行注入组合对象,我们只需要在相关的配置文件中维护对象之间的依赖关系即可。

new对象

平时new A()时候是要import包地址的,这就已经写死了,以后这个引用就死死的指向了那个类,想改变很麻烦,用ac.getbean(“A”)就没引入包,也就是所谓的不依赖 (就是跟那类A没关系),它只从容器找那个叫A的类,至于你给我的是啥,看容器中咋配置。

举个例子:比如说是个很常用的dao类,开始你new的很开心,万一以后需求大改,数据库mysql换db2了,这个dao文件基本就得重写,如果这个类已经封装编译为class文件,不能改了怎么办。又或者你实例化了一个常用接口。

原来那个实现类A不好,要换成B做他的实现类,重写他的方法。你就得把项目中所有实例化的地方都找出来,再改成B(大项目用了很多的话你就一个一个改类似,万一漏了就是不小的bug)。用ioc就没这个麻烦,直接在配置文件中将叫A的bean指向你新写的类就可以。


new 对象里面使用自动注入对象会报空指针异常

根本原因在于当Spring框架帮我们管理的时候就会自动的初始化接下来会用到的属性,而通过new对象的方式,在该new对象中使用到的一些实例就需要自己去做初始化,否则就会报空指针异常。

如下例子所示:TestService 通过@Autowired注入,那么Spring容器就会自动注入TestService 中会用到的TestDao。

@RestController
@RequestMapping(value = "/test")
public class TestController {@Autowiredprivate TestService testService;@RequestMapping(value = "/print",method = RequestMethod.GET)public void test() {testService.test();}
}@Service
public class TestService {@Autowiredprivate TestDao testDao;public void test() {testDao.test();}
}

如果TestService 通过new对象方式新建的话,Spring容器就不会自动注入TestDao,此时testDao为null,会报空指针异常。此时就需要在TestService中自己new一个TestDao对象。如例二所示。

@RestController
@RequestMapping(value = "/test")
public class TestController {private TestService testService = new TestService ();@RequestMapping(value = "/print",method = RequestMethod.GET)public void test() {testService.test();}
}@Service
public class TestService {@Autowiredprivate TestDao testDao;public void test() {TestDao  testDao = new TestDao ();testDao.test();}
}

小结

在程序启动时,Spring会按照一定的加载链来加载并初始化Spring容器中的组件。

例如:在A中注入B,B中注入C。在A中调用B,来使用B中调用C的方法时,如果不采用自动注入,而是使用new对象方式的话,就会报空指针异常(因为B中的C并没有被初始化)。


本文小结

其实spring容器管理对象和new对象,最重要的区别就是IOC容器可以看作第三方的中介,管理着所有的bean以及bean之间的关系,当程序中需要对象的时候,直接去容器中拿就可以了,这样就极大的降低了程序的耦合度,利于代码的编写与维护,所以在程序中,一般看到的都是controller,dao和service这3层。如果直接new的话,程序之间是强耦合,因为使用一个类的时候,是需要导包的,这样维护与修改并不是十分的方便。

spring容器管理对象和new对象相关推荐

  1. spring boot获取spring容器中的bean对象

    我们知道如果我们要在一个类使用  spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接 ...

  2. 在Spring容器外部连接对象依赖项

    有几种有趣的方法可以设置在Spring容器外部实例化的对象的属性和依赖关系. 用例首先,为什么我们需要在Spring容器之外进行依赖注入–我知道三个用例,其中我实例化了Spring容器之外的对象并需要 ...

  3. java 从一个容器获取对象,Java 如何实现从spring容器中获取注入的bean对象

    Java 如何实现从spring容器中获取注入的bean对象 发布时间:2020-11-03 15:27:37 来源:亿速云 阅读:70 作者:Leah 这期内容当中小编将会给大家带来有关Java 如 ...

  4. SpringBoot项目中如何在静态工具类中使用被Spring容器管理的对象

    在开发的过程中,难免会碰到需要在工具类中使用由spring管理的对象的情况,但是我们都知道,工具类中的静态方法中无法引用spirng容器中的对象(被spring管理的对象不是静态的,静态方法中无法调用 ...

  5. 请简述什么是spring的ioc和di_小编Spring是什么、spring容器、IOC和DI

    1.Spring (1)Spring是什么? 是一个轻量级的.用来简化企业级应用开发的开发框架. 注: a.简化开发: Spring对常用的api做了简化,比如,使用Spring jdbc来访问数据库 ...

  6. Spring学习第3篇:Spring容器的基本使用

    大家家好,我是一名网络怪咖,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知Spring重要性,现在普遍都使用SpringBoot来开发,面试的时候SpringBoot原理也 ...

  7. 【SpringBoot】在普通类中获取spring容器中的bean

    这段时间公司搞封闭开发,做一个联通总部的客服系统项目,是基于springboot的.在开发工程中遇到一个页面datagrid数据排序的功能,因为有多个表的数据都要用到排序功能,于是我就写了一个排序功能 ...

  8. Spring —— 容器内部逻辑

    引言 上一篇关于IoC容器的详解<Spring -- IoC 容器详解>真是工程浩大,可以说Spring官网对核心中的核心IOC容器做了非常全面的使用说明,包括在<Spring揭秘& ...

  9. Spring容器,控制反转,依赖注入

    Spring boot学习之旅,为更好督促自己学习以记之,仅供参考. spring容器 程序启动的时候会创建spring容器,扫描给spring容器一个清单,比如:@Controller, @Bean ...

最新文章

  1. Windows程序设计学习笔记(1):一个简单的windows程序
  2. 一致性哈希(Consistent Hashing)
  3. Linux下用C语言最基本的程序开发与调试
  4. [2015-11-10]iis远程发布配置
  5. .NET:命令行解析器介绍
  6. labview叠加白噪声_强化学习中Ornstein-Uhlenbeck噪声是鸡肋吗?
  7. 红米路由器ac2100怎样设置ipv6_红米(Redmi)路由器AC2100手机怎么设置?
  8. php在双引号中输出变量要加大括号,php中输出变量加大括号{}作用_PHP教程
  9. JSF的web.xml配置
  10. 三星S7 android操作系统耗电,2K屏手机玩游戏耗电大、性能渣?三星S7:呵呵
  11. java日志——基本日志+高级日志
  12. oracle 安装display,Linux安装Oracle 11时报错DISPLAY解决方案
  13. Java预科篇1-学前
  14. android view 画文字,【Android自定义View】绘图之文字篇(三)
  15. 使用nssm管理Windows服务
  16. word中图片为嵌入式格式时显示不全_毕设时,在word中插入图片时,图片的格式改为嵌入式后图片藏于文字下方怎么办?...
  17. 这本书非常值得一读!《微习惯》读后感
  18. 2018某二本的秋招流水帐
  19. 阻抗匹配50欧姆的由来
  20. 使用开源的协同办公OA项目,实现规范高效的公文管理

热门文章

  1. JAVA面试-HIBERNATE与 MYBATIS的对比
  2. Linux用户不在sudoers文件中
  3. maven开发web项目的福音,runJettyRun插件使用
  4. 乱谈卡巴CCTV黄金时段广告
  5. 存储网络系统的瓶颈分析以及瓶颈的解决之道
  6. 分布式压测系列之Jmeter4.0
  7. 微信小程序-上传多张图片加进度条(支持预览、删除)
  8. 修改PPC下的移动运营商名称为中文
  9. MySQL性能调优my.cnf详解
  10. Android 升级下载 它们的定义Updates 兼容版本