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. 最基础的SSM框架整合篇

    一.简单理解 Spring.Spring MVC和MyBatis的整合主要原理就是将我们在单独使用Spring MVC和MyBatis过程中需要自己实例化的类都交由Ioc容器来管理,过程分为两步: 第 ...

  2. 通过jquery实现form表单提交后不跳转页面,保留当前页面

    jquery代码: <script type="text/javascript" src="../js/jquery-1.8.3.min.js">& ...

  3. mysql中索引,触发器,事务,存储引擎的理解

    网址:http://blog.51cto.com/760470897/1790460

  4. antd动态的表格合并(包含排序功能)

    主要是两个步骤, 1.处理接口返回数据,给其添加两个属性,一个是合并行数(列数),一个是当前数据的序号 2.在columns结合antd官网的处理方法合并表格 3.尽可能得减少计算量 数据处理函数 / ...

  5. 延时间隔(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 像"饭前洗手"这种事,绝大部分情况下,是洗完手马上就可以动筷子开吃,但总会有意外,比如手都洗好了,突然 ...

  6. mongodb 连接方式之mongo-shell

    单机连接:mongo 120.131.0.64:27017 -u root -p KingSoft@1314 --authenticationDatabase admin 字符串连接 python i ...

  7. label标签利用jquery获取值得方式为$("#message").html()

    label标签利用jquery获取值的方式为$("#message").text(), 赋值的方式为:$("message").html("北京欢迎你 ...

  8. 前端实现list排序

    需求 针对list中某个字段,实现list的升序和降序 效果图 代码 我是用在angular1.X中项目的,根据list中的sort字段进行排序. # sort.html <style> ...

  9. Linux(centos)使用docker安装pdf2htmlEX

    pdf2htmlEX是一款可以将pdf文档转换成html文件的插件,但是Linux系统安装起来很麻烦,所以我们使用docker进行安装 首先要安装docker 因为国外镜像很慢,所以我们这边修改使用国 ...

  10. 【LeetCode】170. Two Sum III - Data structure design 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数组+字典 平衡查找树+双指针 日期 题目地址:htt ...