「javaioc原理」ioc的实现原理

博主:adminadmin 2022-11-24 03:27:06 53

本篇文章给大家谈谈javaioc原理,以及ioc的实现原理对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

面试aop与ioc原理是什么?

1、ioc:java 程序中的每个业务逻辑至少需要两个或以上的对象来协作完成,通常,在使用其他的合作对象时,均要使用像 new object() 这样的语法来完成合作对象的申请工作。

2、aop:利用一种称为 “横切” 的技术,解剖封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,这样就能减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。

扩展资料

工作模式:

1、AOP:面向切面(方便)编程,可以为某一类对象 进行监督和控制,也就是在调用这类对象的具体方法的前后去调用你指定的功能模块,从而达到对一个模块扩充的功能,可以通过注解或者XML文档进行实现。

2、IOC:控制反转(DI依赖注入),将以前由自己手动创建对象的过程交给了Spring,Spring帮助我们生产对象、管理对象、管理对象和对象之间的依赖关系,降低了代码的耦合度,方便我们后期对项目做维护。

求大神,java中IOC具体是个什么意思

IOC(Inverse of Control):控制反转。

1、本来程序使用哪一个bean是在程序中指定(由程序员具体指定),而使用Spring以后我们将具体的配置写在xml中,由xml来控制;

2、本来类的实例化需要通过new XX() 来实例化一个对象,现在通过spring容器来帮忙实例化类的对象

spring ioc原理是什么?

spring中ioc使用的是“生产工厂”,aop使用的是“动态代理”想知道更多建议去看一下 马士兵 的系列视频教程。

主要应用了java的反射技术,很酷;可以根据给定的参数(主要是字符串);创建相应的bean,访问相应的方法或构造器以及成员变量;具体应用可以查看帮助文档 java。lang。reflect包下的Constructor,Method, Field/java。lang。Class。

Spring是全面的和模块化的。Spring有分层的体系结构,这意味着你能选择使用它孤立的任何部分,它的架构仍然是内在稳定的。例如,你可能选择仅仅使用Spring来简单化JDBC的使用,或用来管理所有的业务对象。

它的设计从底部帮助你编写易于测试的代码。Spring是用于测试驱动工程的理想的framework。

Spring对你的工程来说,它不需要一个以上的framework。Spring是潜在地一站式解决方案,定位于与典型应用相关的大部分基础结构。它也涉及到其他framework没有考虑到的内容。

Java IOC 如何应用

二、 IOC使用的背景

在我们日常的设计中,类与类之间存在着千丝万缕的关系,如果两个类存在着强耦合关系,那么在维护时,一个类的修改很可能会牵动另一个类的关联修改,从而使得我们的维护工作步履维艰。下面让我们来看这样的一个强耦合反面例子。

首先我们建立一个Chinese.java类,该类的sayHelloWorld(String name)方法,用中文对名为name的人问好,其内容如下:

package org.amigo.reflection;

/**

*中国人类.

*@authora href="mailto:xiexingxing1121@126.com"AmigoXie/a

*Creationdate:2007-10-2-上午10:37:17

*/

publicclass Chinese {

/**

*用中文对某人问好.

*@paramname姓名

*/

publicvoid sayHelloWorld(String name) {

String helloWorld = "你好," + name;

System.out.println(helloWorld);

}

}

下面我们接着建立一个American.java类,该类的sayHelloWorld(String name)方法,用英文对名为name的人问好,其内容如下:

package org.amigo.reflection;

/**

*美国人类.

*@authora href="mailto:xiexingxing1121@126.com"AmigoXie/a

*@version1.0

*Creationdate:2007-10-2-上午10:41:27

*/

publicclass American {

/**

*用英文对某人问好.

*@paramname姓名

*/

publicvoid sayHelloWorld(String name) {

String helloWorld = "Hello," + name;

System.out.println(helloWorld);

}

}

最后我们编写一个测试类对这两个类的sayHelloWorld(String name)方法进行测试,下面是该类的内容:

package org.amigo.reflection;

/**

*HelloWorld测试.

*@authora href="mailto:xiexingxing1121@126.com"AmigoXie/a

*Creationdate:2007-10-2-上午10:45:13

*/

publicclass HelloWorldTest {

/**

*测试Chinese和American的sayHelloWorld()方法.

*@paramargs

*@authora href="mailto:xiexingxing1121@126.com"AmigoXie/a

*Creationdate:2007-10-2-上午10:43:51

*/

publicstaticvoid main(String[] args) {

Chinese chinese = new Chinese();

chinese.sayHelloWorld("阿蜜果");

American american = new American();

american.sayHelloWorld("Amigo");

}

}

观察HelloWorldTest我们可以很清楚的看到,该类与Chinese.java类和American.java类都存在强耦合关系。

上面的例子让我们想到的是在N年以前,当我们需要某个东西时,我们一般是自己制造。但是当发展到了一定的阶段后,工厂出现了,我们可以工厂中购买我们需要的东西,这极大的方便了我们。在上例中,我们都是通过new来创建新的对象,在开发中,这种强耦合关系是我们所不提倡的,那么我们应该如何来实现这个例子的解耦呢?我们接着想到了使用工厂模式,我们需要新建一个工厂类来完成对象的创建,并采用依赖接口的方式,此时需要对代码进行如下修改:

首先建立接口类Human.java,其内容如下。

package org.amigo.reflection;

/**

* 人类接口类.

* @author a href="mailto:xiexingxing1121@126.com"AmigoXie/a

* Creation date: 2007-10-2 - 上午11:04:56

*/

public interface Human {

/**

* 对某人问好.

* @param name 姓名

*/

public void sayHelloWorld(String name);

}

并将American.java类和Chinese.java类改为实现该接口,即类头分别改成:public class American implements Human和public class Chinese implements Human。

接着编写HumanFactory.java工厂类,其内容为:

package org.amigo.reflection;

/**

* 工厂类.

* @author a href="mailto:xiexingxing1121@126.com"AmigoXie/a

* Creation date: 2007-10-2 - 上午11:09:30

*/

public class HumanFactory {

/**

* 通过类型字段获取人的相应实例

* @param type 类型

* @return 返回相应实例

*/

public Human getHuman(String type) {

if ("chinese".equals(type)) {

return new Chinese();

} else {

return new American();

}

}

}

最后我们还需要修改测试类HelloWorld.java类,修改后的内容如下:

package org.amigo.reflection;

/**

* HelloWorld测试.

* @author a href="mailto:xiexingxing1121@126.com"AmigoXie/a

* Creation date: 2007-10-2 - 上午10:45:13

*/

public class HelloWorldTest {

/**

* 测试sayHelloWorld()方法.

* @param args

* @author a href="mailto:xiexingxing1121@126.com"AmigoXie/a

* Creation date: 2007-10-2 - 上午10:43:51

*/

public static void main(String[] args) {

HumanFactory factory = new HumanFactory();

Human human1 = factory.getHuman("chinese");

human1.sayHelloWorld("阿蜜果");

Human human2 = factory.getHuman("american");

human2.sayHelloWorld("Amigo");

}

}

观察此例我们可以看到,该类不再与具体的实现类Chinese和American存在耦合关系,而只是与它们的接口类Human存在耦合关系,具体对象的获取只是通过传入字符串来获取,很大程度上降低了类与类之间的耦合性。

依赖注入究竟有什么好处?

把对象生成放在了XML里定义,所以换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的),只要修改XML就可以。这样甚至可以实现对象的热插拨。

依赖注入:

依赖注入就是Spring设计思想中重要的一部分,它是指Ioc或DI,是一个重要的面向对象编程的法则来削减计算机程序的耦合问题.控制反转还有一个名字叫做依赖注入(DependencyInjection).简称DI.

IoC亦称为“依赖倒置原理”("DependencyInversionPrinciple")。差不多所有框架都使用了“倒置注入(Fowler2004)技巧,这可说是IoC原理的一项应用。SmallTalk,C++,Java或各种.NET语言等面向对象程序语言的程序员已使用了这些原理。

应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注入到对象中。所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转。

依赖注入(DependencyInjection)和控制反转(InversionofControl)是同一个概念。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。

不管是依赖注入,还是控制反转,都说明Spring采用动态、灵活的方式来管理各种对象。对象与对象之间的具体实现互相透明。在理解依赖注入之前,看如下这个问题在各种社会形态里如何解决:一个人(Java实例,调用者)需要一把斧子(Java实例,被调用者)。

(1)原始社会里,几乎没有社会分工。需要斧子的人(调用者)只能自己去磨一把斧子(被调用者)。对应的情形为:Java程序里的调用者自己创建被调用者。

(2)进入工业社会,工厂出现。斧子不再由普通人完成,而在工厂里被生产出来,此时需要斧子的人(调用者)找到工厂,购买斧子,无须关心斧子的制造过程。对应Java程序的简单工厂的设计模式。

(3)进入“按需分配”社会,需要斧子的人不需要找到工厂,坐在家里发出一个简单指令:需要斧子。斧子就自然出现在他面前。对应Spring的依赖注入。

第一种情况下,Java实例的调用者创建被调用的Java实例,必然要求被调用的Java类出现在调用者的代码里。无法实现二者之间的松耦合。

第二种情况下,调用者无须关心被调用者具体实现过程,只需要找到符合某种标准(接口)的实例,即可使用。此时调用的代码面向接口编程,可以让调用者和被调用者解耦,这也是工厂模式大量使用的原因。但调用者需要自己定位工厂,调用者与特定工厂耦合在一起。

第三种情况下,调用者无须自己定位工厂,程序运行到需要被调用者时,系统自动提供被调用者实例。事实上,调用者和被调用者都处于Spring的管理下,二者之间的依赖关系由Spring提供。

所谓依赖注入,是指程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入。Spring的依赖注入对调用者和被调用者几乎没有任何要求,完全支持对POJO之间依赖关系的管理。

依赖注入通常有两种:

1、设值注入。

2、构造注入。

javaioc原理的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于ioc的实现原理、javaioc原理的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-24,除非注明,否则均为首码项目网原创文章,转载请注明出处。