深入谈谈 Java IOC 和 DI
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的更多相关文章
- 谈谈对IOC及DI的理解与思考
一.前言 在实际的开发过程中,我们经常会遇到这样的情况,在进行调试分析问题的时候,经常需要记录日志信息,这时可以采用输出到控制台. 因此,我们通常会定义一个日志类,来实现输出日志. 定义一个生成验证的 ...
- Java 反射和内省实现spring的IOC和DI
1.构造两个JavaBean package com.spring.model; public class People { private Car car; public Car getCar() ...
- [原创]java WEB学习笔记97:Spring学习---Spring 中的 Bean 配置:IOC 和 DI
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- (转)spring IOC、DI理解
转自: http://www.cnblogs.com/xdp-gacl/p/4249939.html 个人理解: IOC控制反转,反转的是获取依赖对象的方式.传统的应用在存在依赖关系时,比如A依赖于B ...
- 对Spring Ioc 以及DI的精彩理解
转:http://blog.csdn.net/cyjs1988/article/details/50352916 学习过spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注 ...
- JQuery选择器大全 前端面试送命题:面试题篇 对IOC和DI的通俗理解 c#中关于协变性和逆变性(又叫抗变)帮助理解
JQuery选择器大全 jQuery 的选择器可谓之强大无比,这里简单地总结一下常用的元素查找方法 $("#myELement") 选择id值等于myElement的元素 ...
- 一个由正则表达式引发的血案 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. 一些特殊字符,如“&”,“- ...
- 对IOC和DI的通俗理解
学习过spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- 浅析IOC 和 DI
学习过spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
随机推荐
- 【Spark】【RDD】从HDFS创建RDD
1.在HDFS根目录下创建目录(姓名学号) hdfs dfs -mkdir /zwj25 hdfs dfs -ls / 访问 http://[IP]:50070 2.上传本地文件到HDFS hdfs ...
- 连接opcserver时报错 connecting to OPC Server "****" CoCreateInstance 服务器运行失败
在普通windows系统连接OPCServer可能会报这样的错,排查很长时间,OPCServer跟Client都运行正常,点号录入也正常. 最后发现,其实是OPCServer 与OPCClient 权 ...
- Mysql安全加固
1.确保MYSQL_PWD环境变量未设置 描述 MYSQL_PWD环境变量的使用意味着MYSQL凭证的明文存储,极大增加MySQL凭据泄露风险. 加固建议 删除系统环境变量中MySQL密码(MYSQL ...
- java多线程10:并发工具类CountDownLatch、CyclicBarrier和Semaphore
在JDK的并发包(java.util.concurrent下)中给开发者提供了几个非常有用的并发工具类,让用户不需要再去关心如何在并发场景下写出同时兼顾线程安全性与高效率的代码. 本文分别介绍Coun ...
- LuoguB2105 矩阵乘法 题解
Content 给定一个 \(n\times m\) 的矩阵 \(A\) 和一个 \(m\times k\) 的矩阵 \(B\),求两个矩阵相乘得到的矩阵. \(n\times m\) 的矩阵 \(A ...
- AT4151 [ABC099B] Stone Monument 题解
Content 一个村里有 \(999\) 个房子,第 \(i\) 个房子的高度为 \(1+2+...+i=\sum\limits_{j=1}^ij\).现在下了一场雪,给定相邻两个房子没被雪覆盖的高 ...
- ElasticSearch 使用
一.索引操作 --------------------------------- 创建索引(PUT) PUT /索引名 curl -X PUT http://10.20.20.214:9200/sho ...
- Python的 垃圾回收机制
垃圾回收 1. 小整数对象池 整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间. Python 对小整数的定义是 [-5, 257) 这些整 ...
- libevent源码学习(10):min_heap数据结构解析
min_heap类型定义min_heap函数构造/析构函数及初始化判断event是否在堆顶判断两个event之间超时结构体的大小关系判断堆是否为空及堆大小返回堆顶event分配堆空间堆元素的上浮堆元素 ...
- 为dokcer中最简版ubuntu(70M)增加apt安装能力
如果要在docker中安装软件,除了直接找对应的软件镜像,一般我们会先安装Linux系统,然后再在里面安装各种需要的软件. 比如我想安装乌班图,直接下载官方的版本: 这个目前是Ubuntu20.04, ...