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. 使用jsp制作index,可以通过<c:if test==“管理员”>或<c:if test=="客户">来区别展示用户界面

    <%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ ta ...

  2. 转:Sed使用

    awk于1977年出生,今年36岁本命年,sed比awk大2-3岁,awk就像林妹妹,sed就是宝玉哥哥了.所以 林妹妹跳了个Topless,他的哥哥sed坐不住了,也一定要出来抖一抖. sed全名叫 ...

  3. Windows11下载地址

    10月5日微软推出了Win11正式版本,但是仍然不支持apk格式,不免让人失望.下面是Win11商业版本下载地址: 下载地址1: ed2k://|file|zh-cn_windows_11_busin ...

  4. [BUUCTF]REVERSE——[MRCTF2020]hello_world_go

    [MRCTF2020]hello_world_go 附件 步骤: 例行检查,64位程序,无壳 64位ida载入,检索程序里的字符串,有很多,直接检索flag 一个一个点过去,找到了flag 按a,提取 ...

  5. [BUUCTF]PWN——bbys_tu_2016

    bbys_tu_2016 附件 步骤: 例行检查,32位程序,开启了nx保护 本地试运行一下程序,看看大概的情况,测试时候发现输入长度过长程序会崩溃,猜测输入点存在问题 32位ida载入,检索程序里的 ...

  6. Table.Combine追加…Combine(Power Query 之 M 语言)

    数据源: 销量表和部门表 目标: 其中一表的数据追加到另一表后面,相同列直接追加,不同列增加新列 操作过程: 选取销量表>[主页]>[追加查询]/[将查询追加为新查询]>选择要追加的 ...

  7. OpenWrt之DNS设置

    目录 OpenWrt之DNS设置 0.前言 1.WAN口 2.Lan口 3.LAN口DHCP选项 4.DHCP/DNS 5.总结 参考(Thanks) 附录.DHCP OPTION OpenWrt之D ...

  8. CF424A Squats 题解

    Content 给定一个长度为 \(n\) 的仅由 x 和 X 组成的字符串,求使得字符串中 x 和 X 的数量相等需要修改的次数,并输出修改后的字符串. 数据范围:\(2\leqslant n\le ...

  9. django信号机制 (每个操作前后django都预留了两个钩子,便于统一化添加功能)

    信号 Django中提供了"信号调度",用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 典型应用场景:在所有数据库相关操作(读/ ...

  10. IDEA中SpringBoot启动报错Error:(11, 39) java: 找不到符号

    确保不是依赖没有导入或者编码不对问题后 如果还是不行 可以试试以下方式 解决办法 将图片框中Delegate IDE build 勾选 然后重新启动即可