如果没有springIOC的情况下,写一套系统:Tomcat+Servlet 

其中调用impl的时候,通过new来创建对象(程序主动创建依赖)

每次都需要new一个,导致耦合度太高,如果后期变动、更换impl的时候,需要改动大量代码并且重新测试

IOC控制反转、依赖注入:

通过xml配置、自动注入的方式进行依赖注入(marven引入一些spring框架的依赖)

这时,当Tomcat启动时,会启动一个Spring容器,添加注解的类会交由Spring进行创建实例对象,包括对象与对象之间的引用。

将bean交给Spring容器进行管理--》控制反转

Spring容器

(1)实例化Bean

(2)注入Bean和Bean之间的依赖关系

底层是反射技术

好处:代码解耦,避免大量重复性修改、避免大量的测试,易于代码的维护

图1-1 传统应用程序示意图

当有了IoC/DI的容器后,在客户端类中不再主动去创建这些对象了,如图1-2所示:

图1-2有IoC/DI容器后程序结构示意图

谈谈对Spring IOC的理解 (2015年的文章,通俗易懂)

【评论区】

1、IOC机制的由来和演化

(1)Tomcat最初的流程是接受http请求,然后封装后转发给我们自己写的Servlet,最后由我们手动创建实现类的对象去执行业务逻辑。弊端:耦合性太高。

(2)紧接着整个体系进行演化,Tomcat启动后会去启动一个Spring容器,由Spring将对应的bean进行创建于初始化,并且管理对应的依赖关系,这里的就是控制反转了,将类的调用关系由主动变成了被动,交给了Spring去管理。

(3)有了这个机制以后,就可以轻松的完成解耦,然后引入spring mvc其实就是由它实现了之前servlet的一些功能,处理包装请求,然后一些filter,最终转发到我们的controller,最终调用实现类完成业务逻辑。

(4)整个IOC容器就像是一个map,key是对应的名称,value是通过反射创建的bean。比较明显的作用就是解耦

2、注入的时候为什么不直接注入实现类而是注入接口?

(1)功能可扩展性:如果依赖注入实现类,将来代码就是死得了,注入接口更加灵活

(2)如果注入(DI)的是实现类的话,spring的AOP就会使用CGLIB动态代理,如果后续我们想对该实现类进行扩展和替换就会有问题;当注入的是接口的话,spring的aop默认使用JDK动态代理实现的,提高了实现类的扩展性和可替换

3、我们通过自动装配的注解@autowired 就可以找到这个接口对应的实现类,这个是怎么做到的,如果是多个实现类的呢?

多个可以在注入的时候加qualifier注解或者在你想注入的那个实现类加@primary ,注入的时候优先会找qualifier, 当然与@autowired注解有相同作用的是@resource 和@inject 这两个是Java提供的,@inject还需要导入包,一般还是建议使用@autowired注解

4、反射是什么?

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

用途

在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法。当然,也不是所有的都适合反射,之前就遇到一个案例,通过反射得到的结果与预期不符。阅读源码发现,经过层层调用后在最终返回结果的地方对应用的权限进行了校验,对于没有权限的应用返回值是没有意义的缺省值,否则返回实际值起到保护用户的隐私目的。

详细见

https://www.jianshu.com/p/9be58ee20dee

说说你对Spring的IOC机制的理解可以吗?相关推荐

  1. 请简述什么是spring的ioc和di_理解Spring中的IoC和DI

    什么是IoC和DI IoC(Inversion of Control 控制反转):是一种面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度.其基本思想是:借助于"第三方" ...

  2. spring 的IoC的个人理解

    1.ioc IoC的概念介绍 ( a).依赖注入, 分为依赖 和 注入  , 其实依赖是一种耦合方式, 通过spirng在运行时将这种依赖关系完成, 达到解耦目的, 同时达到代码重用, 方便测试,更加 ...

  3. Java:Spring的IOC原理(大白话解释)

    先行参考以下半成品文章和参考链接,待学完课程后续整理此文章 IOC和DI关系 IOC:Inversion of Control,控制反转 DI:Dependency Injection,依赖注入 关系 ...

  4. Spring基本用法1——Spring的核心机制:IOC、DI

            前言:一直想写一个关于Spring的系列文章,但是构思许久却不知道以什么方式阐述,毕竟要把一个复杂框架说清楚并不是那么容易的,我也只能尽力而为了.Spring系列文章打算以这样的顺序展 ...

  5. spring的DI/IOC机制

    先就IOC和DI谈一点我的看法. IOC(DI):其实这个Spring架构核心的概念没有这么复杂,更不像有些书上描述的那样晦涩.Java程序员都知道:java程序中的每个业务逻辑至少需要两个或以上的对 ...

  6. [Spring 深度解析]第6章 Spring的IoC容器系列

    6. Spring的IoC容器系列 ​ IoC容器为开发者管理对象之间的依赖关系提供了很多便利和基础服务.有许多IoC容器供开发者选择,SpringFramework的IoC核心就是其中一个,它是开源 ...

  7. 初识 Spring(02)---(IOC)

    IOC 参照<Spring思维导图,让Spring不再难懂(IOC篇)> 写过java的都知道:所有的对象都必须创建:或者说:使用对象之前必须先创建.而使用ioc之后,你就可以不再手动创建 ...

  8. Spring中IoC的入门实例

    Spring的模块化是很强的,各个功能模块都是独立的,我们可以选择的使用.这一章先从Spring的IoC开始.所谓IoC就是一个用XML来定义生成对象的模式,我们看看如果来使用的. 数据模型 1.如下 ...

  9. Spring入门 IOC

    JAVA就业套餐课:https://edu.csdn.net/combo/detail/1230 课程说明 一. 技术概览 轻量级的企业应用开发越来越受到广大Java应用开发者的追捧,而Spring框 ...

最新文章

  1. 如何探测局域网中某台主机是否开机_如何选购倒车雷达 倒车雷达的选购和安装方法...
  2. numpy维度交换_numpy之转置(transpose)和轴对换
  3. springboot2 虚拟路径设置_转载—springboot配置虚拟路径以外部访问
  4. 好消息:VS 2008 and .NET 3.5 Beta 2 发布了
  5. 开发团队测试的难与易
  6. 【dfs】年会小游戏
  7. spring基础——<bean>scope属性
  8. idea 配置mysql逆向_idea逆向工程配置
  9. asp.net 抓取html内容,c# – 如何从ASP.NET获取网页的HTML内容
  10. 多图详解Spring框架的设计理念与设计模式
  11. jquery.cookie 插件使用方法
  12. 用户画像案例一:汽车精准营销
  13. TextView常用属性设置
  14. HTML基础代码大全
  15. java卡 apdu_将applet安装到java卡的APDU命令的顺序是什么?
  16. 2007五一[西北行] - 第二天:延安(窑洞,杨家岭,宝塔山...)
  17. element-ui 时间日期选择器格式调整(yyyy-mm-dd)
  18. 微服务启动报错:Shutting down DiscoveryClient
  19. Python+Vue计算机毕业设计网上美妆购物商城8k7w5(源码+程序+LW+部署)
  20. 三,python基础初识。

热门文章

  1. 夺命雷公狗jquery---42克隆
  2. 【Linux_选择题】(D33 0602)
  3. 【Leetcode_easy】748. Shortest Completing Word
  4. Tiktok的发展趋势以及政策支持,你了解多少?
  5. threejs uv贴图
  6. PPT制作学习书目【PPT要你好看】摘录——制作一个新颖的标题页和目录页
  7. BZOJ3850 ZCC Loves Codefires
  8. Failed to find provider for user 0 ; expected to find a valid ContentProvider for的解决办法
  9. hadoop2.7.0-伪分布5分钟快速搭建
  10. python最佳编程_学习 Python 的最佳方式