首页 > 编程知识 正文

bean初始化和实例化的区别,spring ioc和aop原理

时间:2023-05-04 19:21:31 阅读:160445 作者:4713

前言中介绍了Spring Bean的生命周期,在这个周期内有一个重要的概念。IOC容器

大家也知道IOC是Sping的重要核心之一,如何理解它,又起到什么作用? 本文就IOC的原理进行简述。

IOC定义IoC 全称为Inversion of Control,翻译为 “控制反转”,它还有一个别名为 DI(Dependency Injection),即依赖注入。

http://www.Sina.com/: http://www.Sina.com/集装箱决定于运作期,形象为3358 www.Sina.com /。

  DI—Dependency Injection,即“依赖注入”

组件之间依赖关系

如何理解“控制逆转”呢? 理解这一点的关键是需要回答以下四个问题。

3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com/http://www.Sina.com /

3358www.Sina.com/从什么开始是由容器动态的将某个依赖关系注入到组件之中? 实际上,这些  依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。由于控件逆转的概念很模糊,2004年大师级人物Martin Fowler给它起了“依赖注入”的新名字。 对IoC,请参阅3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com/http://www.Sina.com /

为了说明IOC的作用,IOC以年轻人找她为例:

/**年轻人* /公共类别青年{ privatebeautifulgirlbeautifulgirl; YoungMan () /你可能很坚强,但指着肚子结婚(/beautiful girl=new beautiful girl ); } publicvoidsetbeautifulgirl (beautiful girl beautiful girl ) this.beautiful girl=beautiful girl; } publicstaticvoidmain (string [ ] args ) { YoungMan you=new YoungMan ); beautiful girl beautiful girl=new beautiful girl ('您的各种条件'); beautifulGirl.setxxx (扔各种好处) ); //而且你有女票you.set beautiful girl (beautiful girl ); }

不用IOC :年轻人需要new BeautifulGirl (),也就是自己做她的对象。 这个过程既复杂又繁琐,我们必须面对每一个阶段,同时使用完毕后,我们有责任将其销毁。

使用IOC :年轻人不需要自己找她。 相反,如果找IOC,IOC就相当于管理着很多zxdlc资料的婚姻中介公司。 年轻人直接向婚姻中介公司提出需求,婚姻中介公司根据需求提供妹妹。 我们只需要使用它就可以了。

  通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

可以理解为IOC积极地向想使用妹妹的年轻人注入。 调用时使用Autowied。 此对象是上面提到的bean,通过注册进入IOC容器,实例化,然后进入IOC容器的bean缓存池,程序就可以调用它。 这与bean的生命周期相连。 )

通过IOC的注册机制,可以保证对象的安全性和合规性

实例化后的对象只需实例化一次就可以进入IOC容器的bean缓存池,从而降低创建对象的开销,提高程序性能(类似于单实例)

APP应用程序调用对象来自bean缓存池。 这是以秒为单位的对象检索,可以提高调用对象的速度。

回答上面四个问题,答案看起来是:

谁控制谁:在传统的开发模型中,我们都是通过直接new一个对象的方法来创建对象的。 也就是说,是你依赖的对象

直接由你自己控制,但是有了 IOC 容器后,则直接由 IoC 容器来控制。所以“谁控制谁”,当然是 IoC 容器控制对象。控制什么控制对象为何是反转:没有 IoC 的时候我们都是在自己对象中主动去创建被依赖的对象,这是正转。但是有了 IoC 后,所依赖的对象直接由 IoC 容器创建后注入到被注入的对象中,依赖的对象由原来的主动获取变成被动接受,所以是反转。哪些方面反转了所依赖对象的获取被反转了。

 

IOC提供被依赖对象的方式

IOC Service Provider 为被注入对象提供被依赖对象也有如下几种方式:构造方法注入、stter方法注入、接口注入。

构造器注入

构造器注入,顾名思义就是被注入的对象通过在其构造方法中声明依赖对象的参数列表,让外部知道它需要哪些依赖对象。

YoungMan(BeautifulGirl beautifulGirl){ this.beautifulGirl = beautifulGirl; //这里可以定义很多女孩的条件}

构造器注入方式比较直观,对象构造完毕后就可以直接使用,这就好比你出生你家里就给你指定了你媳妇。

setter 方法注入

对于 JavaBean 对象而言,我们一般都是通过 getter 和 setter 方法来访问和设置对象的属性。所以,当前对象只需要为其所依赖的对象提供相对应的 setter 方法,就可以通过该方法将相应的依赖对象设置到被注入对象中。如下:

public class YoungMan { private BeautifulGirl beautifulGirl; public void setBeautifulGirl(BeautifulGirl beautifulGirl) { this.beautifulGirl = beautifulGirl; }}

 

相比于构造器注入,setter 方式注入会显得比较宽松灵活些,它可以在任何时候进行注入(当然是在使用依赖对象之前),这就好比你可以先把自己想要的妹子想好了,然后再跟婚介公司打招呼,你可以要林志玲款式的,赵丽颖款式的,随意性较强。

一般程序中会使用这种方法进行实例化。

接口方式注入

接口方式注入显得比较霸道,因为它需要被依赖的对象实现不必要的接口,带有侵入性。一般都不推荐这种方式。

 

总结:

A对象需要使用合作对象B来共同完成一件事,A要使用B,那么A就对B产生了依赖,也就是A和B之间存在一种耦合关系,并且是紧密耦合在一起。

而使用了Spring之后就不一样了,创建合作对象B的工作是由Spring来做的,Spring创建好B对象,然后存储到一个容器里面,当A对象需要使用B对象时,Spring就从存放对象的那个容器里面取出A要使用的那个B对象,然后交给A对象使用,至于Spring是如何创建那个对象,以及什么时候创建好对象的,A对象不需要关心这些细节问题(你是什么时候生的,怎么生出来的我可不关心,能帮我干活就行),A得到Spring给我们的对象之后,两个人一起协作完成要完成的工作即可。

所以控制反转IoC(Inversion of Control)是说创建对象的控制权进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方,比如转移交给了IoC容器,它就是一个专门用来创建对象的工厂,你要什么对象,它就给你什么对象,有了 IoC容器,依赖关系就变了,原先的依赖关系就没了,它们都依赖IoC容器了,通过IoC容器来建立它们之间的关系。

 

转自:https://www.cnblogs.com/Ronaldo-HD/p/11646194.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。