java di_深入谈谈 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,然后在容器类的标签内配置注入依赖类的信息,

可以直接使用属性 p:

格式是p:【属性名】-ref=“【依赖类的标签id】”

也可以使用里面使用标签配置

4.不使用IOC

这里演示不使用IOC的写法

目录结构

bd79a13a99a64cb99c4c47099217ef82.png

依赖类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.example.javabaisc.ioc;/*** 依赖类*/

public classMDependency {publicString food(){return "苹果";

}

}

View Code

容器类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.example.javabaisc.ioc;/*** 容器类*/

public classMContainer {public voideat(){

System.out.println("饿了,有什么吃的?");//实例依赖类

MDependency m = newMDependency();

System.out.println(m.food());

}

}

View Code

测试类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.example.javabaisc.ioc;importorg.junit.Test;public classIOCTest {

@Testpublic voidt(){//实例容器类

MContainer mContainer = newMContainer();

mContainer.eat();

}

}

View Code

打印结果

df477e9b4b6d67814a4dd92c17ff382c.png

5.构造函数注入

目录结构

bd79a13a99a64cb99c4c47099217ef82.png

依赖类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.example.javabaisc.ioc;/*** 依赖类*/

public classMDependency {publicString food(){return "苹果";

}

}

View Code

容器类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.example.javabaisc.ioc;/*** 容器类*/

public classMContainer {//存储 依赖类对象

private finalMDependency m;//有参构造器

publicMContainer(MDependency mDependency){this.m =mDependency;

}public voideat(){

System.out.println("饿了,有什么吃的?");

System.out.println(m.food());

}

}

View Code

测试类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.example.javabaisc.ioc;importorg.junit.Test;public classIOCTest {

@Testpublic voidt(){//实例依赖类

MDependency mDependency = newMDependency();//实例容器类,并将依赖类对象作为参数注入

MContainer mContainer = newMContainer(mDependency);

mContainer.eat();

}

}

View Code

打印结果

47a24442d00dec7cb3cefc21cfe9df37.png

6.setter注入

目录结构

bd79a13a99a64cb99c4c47099217ef82.png

依赖类

8f900a89c6347c561fdf2122f13be562.pngView Code

容器类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.example.javabaisc.ioc;/*** 容器类*/

public classMContainer {//存储 依赖类对象

privateMDependency m;//setter方法

public voidsetM(MDependency m) {this.m =m;

}public voideat(){

System.out.println("饿了,有什么吃的?");

System.out.println(m.food());

}

}

View Code

测试类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.example.javabaisc.ioc;importorg.junit.Test;public classIOCTest {

@Testpublic voidt(){//实例依赖类

MDependency mDependency = newMDependency();//实例容器类

MContainer mContainer = newMContainer();//调用set方法将依赖类对象作为参数注入

mContainer.setM(mDependency);//mContainer.eat();

}

}

View Code

打印结果

06e81b547e7cb6fcffa483363e83cd9a.png

7.接口注入

05e690906ae8dbf26a3970dc82d21a0d.png

接口

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.example.javabaisc.ioc;public interfaceMDependencyInterface {//注入依赖类对象

voidfood(MDependency mDependency);

}

View Code

依赖类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.example.javabaisc.ioc;/*** 依赖类*/

public classMDependency {publicString food(){return "苹果";

}

}

View Code

容器类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.example.javabaisc.ioc;/*** 容器类*/

public class MContainer implementsMDependencyInterface {//存储 依赖类对象

privateMDependency m;//重写接口方法【实现接口】

@Overridepublic voidfood(MDependency foodname) {

m=foodname;

}public voideat() {

System.out.println("饿了,有什么吃的?");

System.out.println(m.food());

}

}

View Code

测试类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.example.javabaisc.ioc;importorg.junit.Test;public classIOCTest {

@Testpublic voidt(){//实例依赖类

MDependency mDependency = newMDependency();//实例容器类

MContainer mContainer = newMContainer();//调用接口方法将依赖类对象作为参数注入

mContainer.food(mDependency);//mContainer.eat();

}

}

View Code

打印结果

baa7a8b6b6611728626f52b56ec6534b.png

8.javabean容器注入

目录结构

0bf247b9d3df4a08aaa95a0402d20473.png

javabean配置xml文件

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

View Code

依赖类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.example.javabaisc.ioc;/*** 依赖类*/

public classMDependency {publicString food(){return "苹果";

}

}

View Code

容器类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.example.javabaisc.ioc;/*** 容器类*/

public classMContainer {//存储 依赖类对象

privateMDependency m;public voideat() {

System.out.println("饿了,有什么吃的?");

System.out.println(m.food());

}//这是xml文件的javabean使用setter方式将依赖类对象注入进来

public voidsetM(MDependency m) {this.m =m;

}

}

View Code

测试类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.example.javabaisc.ioc;importorg.junit.Test;importorg.springframework.beans.factory.BeanFactory;importorg.springframework.beans.factory.xml.XmlBeanFactory;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;importorg.springframework.core.io.ClassPathResource;public classIOCTest {

@Testpublic voidt() {//低级容器【被抛弃了,不建议使用】//初始化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();

}

}

View Code

打印结果

5eaedd06d8662cb0ca99958131730f5f.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值