IOC(一) - 初识
1、IOC理论推导
之前的传统做法,对象都是通过new出来的,如果需求变更,增加代码的同时需要去改动原有的代码,程序适应不了需求的变更。如果代码量大,修改的代价非常高。
举个简单的例子:一个获取用户信息的接口,有如下几个类
- UserDao
- UserDaoImpl
- UserServiceDao
- UserServiceDaoImpl
获取用户代码:
service中调用dao的方法
后面有需求变更,需要从MySQL和Oracle中获取用户,加了两个接口实现类
那么在调用的时候就得修改代码
为了解决这个问题,可以用set进行动态实现值的注入
在使用set方法之后,已经发生了革命性的变化!
- 之前,程序是主动创建对象!控制权在程序猿手上!
- 使用了set注入之后,程序不再具有主动性,而是变成了被动地接收对象
这种思想,从本质上解决了问题,程序猿不用再去管理对象的创建了。系统的耦合性大大降低,可以更加专注地在业务实现上。这是IOC的原型!
2、IOC本质
控制反转loc(lnversion Of Control),是一种设计思想,DI(依赖注入)是实现IOC的一种方法,也有人认为DI只是lOC的另一种说法。没有lOC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。
IOC是Spring框架的核心内容,使用多种方式完美的实现了IOC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IOC。
Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从Ioc容器中取出需要的对象。
采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。
通俗的话讲:用户访问的service(业务)层,逻辑代码都是在业务层,假如之前只有一个Mysql实现,现在要加一个Oracle实现,以及一些其他的实现,每加一种实现,用户用不着去改变什么,主动权在业务层,由程序控制调用什么实现,不管最终有多少种实现,用户都只调用业务层。
用了IOC思想之后,程序架构没有变化,只是把程序主动权移交了,之前的主动权在业务层,现在移交到用户手中,由用户选择调用什么实现。
这就是最大的区别,主动权的移交。
3、改写案例
3.1 导入Jar包
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.10.RELEASE</version>
</dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency>
3.2. 编写代码
编写一个Hello实体类
public class Hello {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public void show() {System.out.println("this is hello");}
}
编写我们的spring配置文件,官方的默认配置文件名为applicationContext.xml,这里我们暂时命名为beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--bean就是java对象 , 由Spring创建和管理--><bean id="hello" class="com.kuang.pojo.Hello"><property name="name" value="Spring"/></bean>
</beans>
进行测试
@Test
public void fun1(){//获取spring上下文对象,解析beans.xml文件,生成管理相应的Bean对象ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");//getBean : 参数即为spring配置文件中bean的id .Hello hello = (Hello) context.getBean("hello");hello.show();
}
这里
new ClassPathXmlApplicationContext()
的时候有个好记的小技巧,拼音缩写:cpx(吃螃蟹)
3.3. 思考
- Hello 对象是谁创建的 ? 【 hello 对象是由Spring创建的 】
- Hello 对象的属性是怎么设置的 ? 【hello 对象的属性是由Spring容器设置的 】
分析一下xml配置文件中的内容:
bean标签就是一个对象,class是对应的类型,这里就是相当于new了一个Hello
正常Java中,创建一个对象是 类型 变量名 = new 类型();
在IOC中:
- bean标签中id就是变量名
- class是对象的全路径
- property相当于给对象中的相应属性设置一个值
在此篇文章开始之前,先向大家简单介绍 IoC.什么是 IoC?以及为什么我们需要 IoC?以及本文核心,在 TypeScript 中实现一个简单的 IoC 容器? 目录 [隐藏] IoC 定义 初识 ... Spring初识 文章目录 Spring初识 1 认识 2 IOC基础 初识案例: IOC本质 3 HelloSpring 4 IOC创建对象的方式 5 Spring配置 6 属性注入 7 自动装配 ... IOC 参照<Spring思维导图,让Spring不再难懂(IOC篇)> 写过java的都知道:所有的对象都必须创建:或者说:使用对象之前必须先创建.而使用ioc之后,你就可以不再手动创建 ... 学习资料来源:http://how2j.cn/k/spring/spring-ioc-di/87.html 首先,不必为看到两个新名词而感到头疼,理解了它们的作用就会发现其实是很简单的东西 Sprin ... Spring 实践 标签: Java与设计模式 Spring简介 Spring是分层的JavaSE/EE Full-Stack轻量级开源框架.以IoC(Inverse of Control 控制反转) ... 点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:干掉 Navicat:这个 IDEA 的兄弟真香!个人原创100W+访问量博客:点击前往,查看更多 前言 我们对 ... 初识ASP.NET Core的小伙伴一定会发现,其几乎所有的项目依赖都是通过依赖注入方式进行链式串通的.这是因为其使用了依赖注入 (DI) 的软件设计模式,代码的设计是遵循着"高内聚.低耦合 ... Spring 概述 Spring 是什么 Spring 是分层的 Java SE/EE 应用 full-stack (全栈式) 轻量级开源框架. 全栈式:对各种主流技术和框架都进行了整合,同时对三层架 ... 前言 刚开始听到 IoC,会觉得特别高大上,但其实明白原理了很简单. 跟着我的脚步,一文带你吃透 IoC 原理. 本文围绕 是何.为何.如何 来谈: 是何 上一篇文章有同学问我在官网该看哪些内容,怎么 ...IOC(一) - 初识相关推荐
最新文章
热门文章