1.前言

  不得不说, IOC和DI 在写代码时经常用到。还有个就是在面试时 ,面试官老喜欢问 IOC 和DI是什么的问题,都快被问吐了,

可是,仍然会让许多人说的支支吾吾。

  为什么?

第一,因为这个知识实在是太基础了,忽略了操作的叫法,即便开发时老是在使用这个知识点,但是并不知道一直写的这个原来是叫这个啊!
第二,不知道底层原理,谁不知道IOC是控制反转 ,DI是依赖注入?那么面试官来了句为什么?怎么用?那岂不是就凉凉了?

2.定义:

IOC ,英文全称是Inverse of Control,控制反转。
DI,英文全称是Dependency Injection ,依赖注入。

3.总结

(1)IOC是控制反转 ,就是将依赖类的控制权从容器类中移除,将其移到容器类外部去,使用容器类之前,需要从外部将依赖类注入进来。
(2)那么注入依赖类的过程就是DI,意为依赖注入。
(3)能够将依赖类注入容器类的方式共有4种,但是DI依赖注入只占其中的3种,
  分别是构造函数注入【也称构造器注入】、setter注入【也称属性注入】、接口注入【具有侵入性,不建议使用】。
  还有一种是使用javabean容器注入。
(4)而初始化Javabean的容器方式有两种,分别是
  低级容器 XMLBeanFactory【实例对象类型是BeanFactory】、
  高级容器 ClassPathXmlApplicationContext【实例对象类型是ApplicationContext】
  分别将依赖类和容器类使用XML文件注册javabean,然后在容器类的<bean>标签内配置注入依赖类的信息,
  可以直接使用属性 p:
  格式是p:【属性名】-ref=“【依赖类的<bean>标签id】”
  也可以使用<bean>里面使用<property>标签配置

4.不使用IOC

这里演示不使用IOC的写法

目录结构

依赖类

package com.example.javabaisc.ioc;

/**
* 依赖类
*/
public class MDependency {
public String food(){
return "苹果";
}
}

容器类

package com.example.javabaisc.ioc;

/**
* 容器类
*/
public class MContainer {
public void eat(){
System.out.println("饿了,有什么吃的?");
//实例依赖类
MDependency m = new MDependency();
System.out.println(m.food());
}
}

测试类

package com.example.javabaisc.ioc;

import org.junit.Test;

public class IOCTest {

    @Test
public void t(){
//实例容器类
MContainer mContainer = new MContainer();
mContainer.eat();
}
}

打印结果

5.构造函数注入

目录结构

依赖类

package com.example.javabaisc.ioc;

/**
* 依赖类
*/
public class MDependency {
public String food(){
return "苹果";
}
}

容器类

package com.example.javabaisc.ioc;

/**
* 容器类
*/
public class MContainer {
//存储 依赖类对象
private final MDependency m; //有参构造器
public MContainer(MDependency mDependency){
this.m = mDependency;
} public void eat(){
System.out.println("饿了,有什么吃的?");
System.out.println(m.food());
}
}

测试类

package com.example.javabaisc.ioc;

import org.junit.Test;

public class IOCTest {

    @Test
public void t(){
//实例依赖类
MDependency mDependency = new MDependency();
//实例容器类,并将依赖类对象作为参数注入
MContainer mContainer = new MContainer(mDependency);
mContainer.eat();
}
}

打印结果

6.setter注入

目录结构

依赖类

容器类

package com.example.javabaisc.ioc;

/**
* 容器类
*/
public class MContainer {
//存储 依赖类对象
private MDependency m; //setter方法
public void setM(MDependency m) {
this.m = m;
} public void eat(){
System.out.println("饿了,有什么吃的?");
System.out.println(m.food());
}
}

测试类

package com.example.javabaisc.ioc;

import org.junit.Test;

public class IOCTest {

    @Test
public void t(){
//实例依赖类
MDependency mDependency = new MDependency();
//实例容器类
MContainer mContainer = new MContainer();
//调用set方法将依赖类对象作为参数注入
mContainer.setM(mDependency);
//
mContainer.eat();
}
}

打印结果

7.接口注入

接口

package com.example.javabaisc.ioc;

public interface MDependencyInterface {
//注入依赖类对象
void food(MDependency mDependency);
}

依赖类

package com.example.javabaisc.ioc;

/**
* 依赖类
*/
public class MDependency {
public String food(){
return "苹果";
}
}

容器类

package com.example.javabaisc.ioc;

/**
* 容器类
*/
public class MContainer implements MDependencyInterface {
//存储 依赖类对象
private MDependency m; //重写接口方法【实现接口】
@Override
public void food(MDependency foodname) {
m = foodname;
} public void eat() {
System.out.println("饿了,有什么吃的?");
System.out.println(m.food());
} }

测试类

package com.example.javabaisc.ioc;

import org.junit.Test;

public class IOCTest {

    @Test
public void t(){
//实例依赖类
MDependency mDependency = new MDependency();
//实例容器类
MContainer mContainer = new MContainer();
//调用接口方法将依赖类对象作为参数注入
mContainer.food(mDependency);
//
mContainer.eat();
}
}

打印结果

8.javabean容器注入

目录结构

javabean配置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" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="mDependency" class="com.example.javabaisc.ioc.MDependency"/>
<!--写法一 -->
<bean id="mContainer" class="com.example.javabaisc.ioc.MContainer" p:m-ref="mDependency"/>
<!--写法二 -->
<!-- <bean id="mContainer" class="com.example.javabaisc.ioc.MContainer">-->
<!-- <property name="m" ref="mDependency"/>-->
<!-- </bean>--> </beans>

依赖类

package com.example.javabaisc.ioc;

/**
* 依赖类
*/
public class MDependency {
public String food(){
return "苹果";
}
}

容器类

package com.example.javabaisc.ioc;

/**
* 容器类
*/
public class MContainer {
//存储 依赖类对象
private MDependency m; public void eat() {
System.out.println("饿了,有什么吃的?");
System.out.println(m.food());
} //这是xml文件的javabean使用setter方式将依赖类对象注入进来
public void setM(MDependency m) {
this.m = m;
} }

测试类

package com.example.javabaisc.ioc;

import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource; public class IOCTest {
@Test
public void t() {
//低级容器【被抛弃了,不建议使用】
//初始化xml文件里的javabean
// BeanFactory javabean = new XmlBeanFactory(new ClassPathResource("iocConfig.xml"));
//高级容器
//全局初始化xml文件里的javabean
ApplicationContext javabean = new ClassPathXmlApplicationContext("iocConfig.xml");
//实例容器类
MContainer mContainer = (MContainer) javabean.getBean("mContainer");
mContainer.eat(); }
}

打印结果

深入谈谈 Java IOC 和 DI的更多相关文章

  1. 谈谈对IOC及DI的理解与思考

    一.前言 在实际的开发过程中,我们经常会遇到这样的情况,在进行调试分析问题的时候,经常需要记录日志信息,这时可以采用输出到控制台. 因此,我们通常会定义一个日志类,来实现输出日志. 定义一个生成验证的 ...

  2. Java 反射和内省实现spring的IOC和DI

    1.构造两个JavaBean package com.spring.model; public class People { private Car car; public Car getCar() ...

  3. [原创]java WEB学习笔记97:Spring学习---Spring 中的 Bean 配置:IOC 和 DI

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. (转)spring IOC、DI理解

    转自: http://www.cnblogs.com/xdp-gacl/p/4249939.html 个人理解: IOC控制反转,反转的是获取依赖对象的方式.传统的应用在存在依赖关系时,比如A依赖于B ...

  5. 对Spring Ioc 以及DI的精彩理解

    转:http://blog.csdn.net/cyjs1988/article/details/50352916 学习过spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注 ...

  6. JQuery选择器大全 前端面试送命题:面试题篇 对IOC和DI的通俗理解 c#中关于协变性和逆变性(又叫抗变)帮助理解

    JQuery选择器大全   jQuery 的选择器可谓之强大无比,这里简单地总结一下常用的元素查找方法 $("#myELement")    选择id值等于myElement的元素 ...

  7. 一个由正则表达式引发的血案 vs2017使用rdlc实现批量打印 vs2017使用rdlc [asp.net core 源码分析] 01 - Session SignalR sql for xml path用法 MemCahe C# 操作Excel图形——绘制、读取、隐藏、删除图形 IOC,DIP,DI,IoC容器

    1. 血案由来 近期我在为Lazada卖家中心做一个自助注册的项目,其中的shop name校验规则较为复杂,要求:1. 英文字母大小写2. 数字3. 越南文4. 一些特殊字符,如“&”,“- ...

  8. 对IOC和DI的通俗理解

    学习过spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  9. 浅析IOC 和 DI

    学习过spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

随机推荐

  1. 1945-祖安say hello-string

    1 #include<bits/stdc++.h> 2 char str[100][40]; 3 char s[1005]; 4 5 int remark[2000][2] = { 0 } ...

  2. [特征工程] GBDT

  3. 安装Java1.8教程图解

    在服务器上配置Java环境 第一步: 因为我们系统是centOS7 64位的,所以我下载的是最新版本的jdk X64位的 因为阿里云服务器事先就安装好了ssh,我们可以用xsell连上去,我把下载好的 ...

  4. js实现数组扁平化

    数组扁平化的方式 什么是数组扁平化? 数组扁平化:指将一个多维数组转化为一个一维数组. 例:将下面数组扁平化处理. const arr = [1, [2, 3, [4, 5]]] // ---> ...

  5. 40张图+万字,从9个数据类型帮你稳稳的拿捏Redis数据结构

    摘要:本文把Redis新旧版本的数据结构说图解一遍,共有 9 种数据结构:SDS.双向链表.压缩列表.哈希表.跳表.整数集合.quicklist.listpack. 本文分享自华为云社区<为了拿 ...

  6. jquery Ajax 不执行回调函数success的原因

    jquery Ajax 不执行回调函数success的原因: $.ajax({ type: "post", contentType: "application/json& ...

  7. 『与善仁』Appium基础 — 26、常用手机操作的API说明

    目录 1.获取当前手机的时间 2.获取手机屏幕的宽和高 3.获取手机当前网络 4.设置手机网络模式 5.操作手机通知栏 6.综合练习 7.发送键到设备(掌握) 8.手机截图(掌握) 是针对手机一些常用 ...

  8. 【LeetCode】507. Perfect Number 解题报告(Python & Java & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  9. 【LeetCode】290. Word Pattern 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  10. 【LeetCode】139. Word Break 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...