视频地址:https://www.youtube.com/watch?v=TBZUCKb8Gyo&list=PL9Q0S-CmtAhJVjwnK5ip6H84sCuRQcACY&index=22

 单例模式。是指在一次请求中。一个对象只会被实例一次。实例好的对象,会放在内存中,如果再次使用。就不会再去实例了。

而不是你刷新页面。刷新页面是第二次请求了。肯定需要重新实例化。不会从之前的内存中获取了。之前内存中数据。在你请求结束后。就从内存中全部清空了。

magento中的依赖注入,默认情况下是单例模式。

但是当如注入的时候,在注入的类后面加一个factory 就变成了工厂模式了。就不是单例模式了,然后也是依赖注入。但是改变了注入的模式。这样调用本对象后。如果需要实例注入的对象。都会重新注入一个新的。

 

依赖注入

1,常规的依赖注入。和laravel中一样,把另一个对象的类名。注入到本对象的构造函数中,然后再构造函数里对这个对象进行初始化  $this->xxx = xxx;

2,在本注入的构造函数内留一个空的数组。  Array xxx= [];

然后通过di.xml来实现注入

<type name = 'xxxx'  ---->被注入的那个对象>

  <argument = ''xxx''  xsi:type = 'array'>

<item name = '''>xxx</item>

</argument>

</type>

这与就可以注入到构造函数内。当然在这个类中的构造函数,已经对这个array进行了初始化  $this->name = xxxx;

3,可以在需要的地方注入xxxfactory,这个注入的是有一个工厂对象。会在generated这个目录里自动生成这个factory。用来对xxx这个对象进行实例化。用的是工厂模式

4,也可以在需要的地方注入interface,依赖倒置。在di.xml的preference指定真实要注入的,是对这个interface的implement

 factory也可以用interface

在magento内,一个interface一般只会被一个类implement,所以可以通过preference来进行注入。

 5,抽象类(一个抽象类,会被n个类extends,所以不太适合用preference,因为用了preference以后,只要是这个abstract都会被你preference的替代了)

和interface几乎一样,也是在di.xml的preference内进行extends的注入。

abstract的情况,不建议使用preference

建议用type来向这个构造函数内注入这个abstact这个obj,在type内写object。注入这个对象。 

通过这个object注入的对象,不用在构造函数内初始化吗?还是已经初始化了?(已经初始化了)

 

 6,常规类也可以用preference来进行覆盖,但是一般也不这样用。preference一般只用在interface内。

7,proxy

因为当一个对象被依赖注入以后,会在构造函数内初始化,

这代表只要被注入的对象。都会被实例化一次。哪怕这个被注入的对象不被本次请求用到,也需要实例化。这样是很浪费系统资源的。所以用到了proxy。

在后面加一个proxy就可以了。这样就可以保证只有在这个注入的对象被使用的时候,才去实例化。(这个只是不实例化对象,还是指里面的方法,只有在调用的时候才去使用?======是指实例化对象,看过源码了)反正就是为了节省资源,只要在di.xml里定义下就可以了。别的地方不用修改。 ======只有在调用这个对象内部方法的时候才去实例化这个对象。在初始化的时候不会实例化这个对象。

 代理模式----只有调用对象内部方法的时候,才去实例化这个对象。

8,virtual type

相当于依赖注入嵌套。先依赖注入(把这个类中的构造函数内的东西改掉),改好后,再把改好后的类,再注入到目标类里面。实现了依赖注入的嵌套。

给main.php的够着函数内的defaultName这个变量,注入了一个自己定义的virtual type。并且这个virtual type使用另一个类注入新的类生成的。所以感觉是依赖注入嵌套。 

更多推荐