深入谈谈 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这两个概念是模糊不清的,是很难理解的,今天和大家 ...
随机推荐
- 部署应用程序到Tomcat的webapps目录
一.方法如下 1.通过MyEclipse上方工具栏Manage Deployments,依次选择项目和服务器: 2.通过右击项目Export,生成war包到webapps中: 3.复制项目WebRoo ...
- 【HarmonyOS】【多线程与并发】EventHandler
EventHandler与EventRunner EventHandler相关概念 ● EventHandler是一种用户在当前线程上投递InnerEvent事件或者Runnable任务到异步线程上处 ...
- MySQL安装详细教程(数据库免安装版)
MySQL安装详细教程(数据库免安装版)mysql-5.7.33-winx64.zip 一.软件下载 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产 ...
- java 注解的几大作用及使用方法详解
初学者可以这样理解注解:想像代码具有生命,注解就是对于代码中某些鲜活个体的贴上去的一张标签.简化来讲,注解如同一张标签. 在未开始学习任何注解具体语法而言,你可以把注解看成一张标签.这有助于你快速地理 ...
- SROP例题
具体攻击原理可以参考安全客这篇文章:入口 刚学了一点,也是懵懵懂懂的,拿几道题来练练手. ciscn_2019_es_7 64位程序,只开启了NX保护. 相当于执行了read(0,buf,0x400) ...
- png crc讲解
我太难了. 我真的是为你们着想,你们学姐说misc太简单了,可就是这么简单我相信你们也不会做...我还得给你们讲解... 加油吧!!! 工具:010editor 这个我想给你放下载链接来着,后来 ...
- JAVA微信公众号网页开发——将接收的消息转发到微信自带的客服系统
如果公众号处于开发模式,普通微信用户向公众号发消息时,微信服务器会先将消息POST到开发者填写的url上,无法直接推送给微信自带的客服功能.如果需要把用户推送的普通消息推送到客服功能中,就需要进行代码 ...
- 【九度OJ】题目1205:N阶楼梯上楼问题 解题报告
[九度OJ]题目1205:N阶楼梯上楼问题 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1205 题目描述: N阶楼梯上楼问题:一次 ...
- Brute-force Algorithm(hdu3221)
Brute-force Algorithm Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- 1281 - New Traffic System
1281 - New Traffic System PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 ...