di.xml
di.xml文件
领域和应用入口点
每个 模块 都可以具有全局和区域特定的di.xml文件。Magento读取di.xml系统中声明的所有配置文件,并通过附加所有节点将它们合并在一起。
作为一般规则,区域特定di.xml文件应配置表示层的依赖关系,并且模块的全局di.xml文件应配置其余依赖关系。
Magento在以下阶段加载配置:
- 初始(
app/etc/di.xml) - 全局(
<moduleDir>/etc/di.xml) - 特定区域(
<moduleDir>/etc/<area>/di.xml)
在引导期间,每个应用程序入口点都会加载di.xml所请求区域的相应文件。
例子:
在
index.php,\Magento\Framework\App\Http该类根据url中提供的前缀加载区域 。在
static.php,\Magento\Framework\App\StaticResource该类还根据请求中的url加载区域。在
cron.php,\Magento\Framework\App\Cron该类始终加载'crontab'区域。
输入配置
类型配置描述了对象的生活方式以及如何实例化它。
您可以di.xml通过以下方式在配置节点中配置类型:
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<virtualType name="moduleConfig" type="Magento\Core\Model\Config">
<arguments>
<argument name="type" xsi:type="string">system</argument>
</arguments>
</virtualType>
<type name="Magento\Core\Model\App">
<arguments>
<argument name="config" xsi:type="object">moduleConfig</argument>
</arguments>
</type>
</config>
前面的示例声明了以下类型:
moduleConfig:扩展类型的虚拟类型Magento\Core\Model\Config。Magento\Core\Model\App:此类型的所有实例都接收moduleConfig作为依赖项的实例。
虚拟类型
一个 虚拟的类型 ,您可以更改特定注射依赖的论据和改变特定类的行为。这允许您使用自定义类,而不会影响其他依赖于原始类的类。
该示例为for创建虚拟类型,Magento\Core\Model\Config并指定system为构造函数参数type。
构造函数参数
您可以di.xml在参数节点中配置类构造函数参数。对象管理器在创建期间将这些参数注入到类中。XML 文件中配置 的参数名称必须与配置的类中构造函数中的参数名称相对应。
以下示例创建实例,Magento\Core\Model\Session其中类构造函数参数$sessionName设置为以下值adminhtml:
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Core\Model\Session">
<arguments>
<argument name="sessionName" xsi:type="string">adminhtml</argument>
</arguments>
</type>
</config>
参数类型
object
- 节点格式:
-
<argument xsi:type="object">{typeName}</argument> <argument xsi:type="object" shared="{shared}">{typeName}</argument>
创建一个typeName类型的实例并将其作为参数传递。您可以传递任何类名,接口名或虚拟类型typeName。
设置shared属性定义已创建实例的生活方式。见对象的生活方式配置。
string
- 节点格式:
-
<argument xsi:type="string">{strValue}</argument> <argument xsi:type="string" translate="true">{strValue}</argument>
Magento将此参数节点的任何值解释为字符串。
boolean
- 节点格式:
-
<argument xsi:type="boolean">{boolValue}</argument>
Magento将此参数节点的任何值转换为布尔值。见下表:
| 输入类型 | 数据 | 布尔值 |
|---|---|---|
| 布尔 | 真正 | 真正 |
| 布尔 | 假 | 假 |
| 串 | “真正”* | 真正 |
| 串 | “假”* | 假 |
| 串 | “1” | 真正 |
| 串 | “0” | 假 |
| 整数 | 1 | 真正 |
| 整数 | 0 | 假 |
*这些字符串文字区分大小写
number
- 节点格式:
-
<argument xsi:type="number">{numericValue}</argument>
此类型的可接受值包括:整数,浮点数或数字字符串。
init_parameter
- 节点格式:
-
<argument xsi:type="init_parameter">{Constant::NAME}</argument>
这是由全局应用程序初始化参数表示的Constant::NAME。
const
- 节点格式:
-
<argument xsi:type="const">{Constant::NAME}</argument>
这是由...表示的常数值Constant::NAME。
null
- 节点格式:
-
<argument xsi:type="null"/>
这表示空值。
array
- 节点格式:
-
<argument xsi:type="array">
<item name="someKey" xsi:type="<type>">someVal</item>
</argument>
Magento使用与项目对应的元素构建一个数组,并将其作为参数传递。该数组可以包含无限数量的项,每个数组项可以是任何对象类型,包括数组本身。
当Magento合并给定范围的配置文件时,具有相同名称的数组参数将合并到一个新数组中。
当Magento稍后通过更具体的范围或通过代码加载新配置时,新配置中的任何数组定义都将替换加载的配置而不是合并。
参数示例:
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Example\Type">
<arguments>
<!-- Pass simple string -->
<argument name="stringParam" xsi:type="string">someStringValue</argument>
<!-- Pass instance of Magento\Some\Type -->
<argument name="instanceParam" xsi:type="object">Magento\Some\Type</argument>
<!-- Pass true -->
<argument name="boolParam" xsi:type="boolean">1</argument>
<!-- Pass 1 -->
<argument name="intParam" xsi:type="number">1</argument>
<!-- Pass application init argument, named by constant value -->
<argument name="globalInitParam" xsi:type="init_parameter">Magento\Some\Class::SOME_CONSTANT</argument>
<!-- Pass constant value -->
<argument name="constantParam" xsi:type="const">Magento\Some\Class::SOME_CONSTANT</argument>
<!-- Pass null value -->
<argument name="optionalParam" xsi:type="null"/>
<!-- Pass array -->
<argument name="arrayParam" xsi:type="array">
<!-- First element is value of constant -->
<item name="firstElem" xsi:type="const">Magento\Some\Class::SOME_CONSTANT</item>
<!-- Second element is null -->
<item name="secondElem" xsi:type="null"/>
<!-- Third element is a subarray -->
<item name="thirdElem" xsi:type="array">
<!-- Subarray contains scalar value -->
<item name="scalarValue" xsi:type="string">ScalarValue</item>
<!-- and application init argument -->
<item name="globalArgument " xsi:type="init_parameter">Magento\Some\Class::SOME_CONSTANT</item>
</item>
</argument>
</arguments>
</type>
</config>
合并和争论
在合并期间,如果类型不同,则参数将替换具有相同名称的其他参数。如果参数类型相同,则较新的参数将替换旧参数。
抽象实现映射
当类的构造函数签名通过其接口请求对象时,对象管理器使用抽象实现映射。对象管理器使用这些映射来确定特定范围的该类的默认实现。
该preference节点指定默认的实现:
<!-- File: app/etc/di.xml -->
<config>
<preference for="Magento\Core\Model\UrlInterface" type="Magento\Core\Model\Url" />
</config>
此映射位于app/etc/di.xml,因此对象管理器会在全局范围内Magento\Core\Model\Url有请求的地方注入实现类Magento\Core\Model\UrlInterface。
<!-- File: app/code/core/Magento/Backend/etc/adminhtml/di.xml -->
<config>
<preference for="Magento\Core\Model\UrlInterface" type="Magento\Backend\Model\Url" />
</config>
此映射位于app/code/core/Magento/Backend/etc/adminhtml/di.xml,因此对象管理器会在管理 区域中的Magento\Backend\Model\Url任何请求中注入实现类。Magento\Core\Model\UrlInterface
参数配置继承
为类类型配置的参数将其配置传递给其后代类。任何后代都可以覆盖为其超类型配置的参数; 也就是父类或接口:
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Framework\View\Element\Context">
<arguments>
<argument name="urlBuilder" xsi:type="object">Magento\Core\Model\Url</argument>
</arguments>
</type>
<type name="Magento\Backend\Block\Context">
<arguments>
<argument name="urlBuilder" xsi:type="object">Magento\Backend\Model\Url</argument>
</arguments>
</type>
</config>
在前面的例子中,Magento\Backend\Block\Context是一个后代Magento\Framework\View\Element\Context。
第一个条目将所有实例Magento\Framework\View\Element\Context以及它的子项配置Magento\Core\Model\Url为$urlBuilder在其构造函数中传入。
第二个条目会覆盖它并配置Magento\Backend\Block\Context要Magento\Backend\Model\Url用作的所有实例$urlBuilder。
对象生活方式配置
对象的生活方式决定了该对象可以存在的实例数。
您可以在Magento中配置依赖项以具有以下生活方式:
- singleton(默认) - 此类的一个实例存在。对象管理器在第一次请求时创建它。再次请求该类将返回相同的实例。处置或结束注册到它的容器会释放实例。
- transient - 对象管理器为每个请求创建一个新的类实例。
该shared属性决定了两者的生活方式argument和type配置。
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Filesystem" shared="false">
<arguments>
<argument name="adapter" xsi:type="object" shared="false">Magento\Filesystem\Adapter\Local</argument>
</arguments>
</type>
</config>
在此示例Magento\Filesystem中不共享,因此所有客户端都将检索单独的实例Magento\Filesystem。此外,每个实例都Magento\Filesystem将获得单独的实例$adapter,因为它也是非共享的。
di.xml的更多相关文章
- Spring 简单使用IoC与DI——XML配置
目录 Spring简介 导入jar包 Spring配置文件 Spring的IoC IoC简介 快速使用IoC Spring创建对象的三种方式 使用构造方法 使用实例工厂 使用静态静态工厂 Spring ...
- 黑马-Spring(IOC&DI) AOP
IOC(控制翻转) 概念 把对象的创建.初始化.销毁等工作交给spring容器来做 案例 环境 步骤 1. 写一个HelloWorld类 2. 写一个配置文件 把hello类放到spring容 ...
- 4.spring di
spring di,即依赖注入,从应用的浅显意义来讲就是对属性赋值 1.用setter赋值,在spring的applicationContext.xml配置文件的bean下的property标签 属性 ...
- 通过xsd schema结构来验证xml是否合法
import sys import StringIO import lxml from lxml import etree from StringIO import StringIO # Constr ...
- Spring学习笔记之基础、IOC、DI(1)
0.0 Spring基本特性 Spring是一个开源框架:是基于Core来架构多层JavaEE系统 1.0 IOC 控制反转:把对象的创建过程交给spring容器来做. 1.1 application ...
- 【10分钟学Spring】:(二)一文搞懂spring依赖注入(DI)
Spring最基础的特性就是创建bean.管理bean之间的依赖关系.下面通过具体实例演示该如何装配我们应用中的bean. Spring提供了三种主要的装配机制 在xml中进行显示的配置 在Java中 ...
- Spring学习笔记
Spring 的控制反转:把对象的创建.初始化.销毁等工作交给Spring 容器来做,有spring容器控制对象的生命周期 applicationContext.xml beans --->sp ...
- spring.net
Spring.Net有两个很重要的感念就是IoC(控制反转)和DI(依赖注入). IoC.英文全称Inversion of Control.控制反转.DI.英文全称Dependency Injecti ...
- Spring day01笔记
struts:web层,比较简单(ValueStack值栈,拦截器) hibernate:dao层,知识点杂 spring:service层,重要,讲多少用多少 --> [了解] sprin ...
随机推荐
- 使用VsCode自带的Emmet语法
新建html文件,保存之后,输入"!",按Tap(或Enter)键,自动生成HTML结构 标签只要直接输入标签名(不要输入<>),按Tap(或Enter)键自动生成完整 ...
- Linux内存描述之高端内存--Linux内存管理(五)
1. 内核空间和用户空间 过去,CPU的地址总线只有32位, 32的地址总线无论是从逻辑上还是从物理上都只能描述4G的地址空间(232=4Gbit),在物理上理论上最多拥有4G内存(除了IO地址空间, ...
- 什么是tomcat集群?
什么是tomcat集群? 利用nginx对请求进行分流,将请求分配给不同的tomcat去处理,减少每个tomcat的负载量,提高服务器的响应速度. 目标 实现高性能负载均衡的tomcat集群. 工具 ...
- [RHEL 6]GPT分区--parted
对于2T以上的硬盘,划分分区表需要GPT分区,RHEL 6中使用parted进行分区 用法:parted [选项]... [设备 [命令 [参数]...]...] 将带有“参数”的命令应用于“设备”. ...
- LeetCode算法题-Student Attendance Record I(Java实现)
这是悦乐书的第258次更新,第271篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第125题(顺位题号是551).您将获得一个表示学生出勤记录的字符串. 该记录仅包含以下 ...
- Docker: Harbor一些小知识
镜像文件上传到私有仓库harbor后,镜像的物理存储位置在哪里? 这些信息记录在docker-compose.yml里,通过观察发现 镜像存储在了宿主机的 volumes: - /data/regis ...
- c# 正则验证
1.验证百分数 bool tempBool = Regex.IsMatch(str, @"[1-9]{0,1}[0-9](\\.[0-9])?%");
- c++11の简单线程管理
1.简单的例子 #include "stdafx.h" #include <iostream> #include <thread> void functio ...
- 10分钟,AppCan帮你搞定跨平台开发APP问题!
跨平台开发APP时,开发者总会遇到一些问题,如打包失败等等,尤其对于iOS来说,由于它的限制性会导致一些状况发生(如证书上传问题等),小编总结了几个AppCan在线IOS打包失败常见的情况及排查技巧, ...
- leetcode 136. Single Number 、 137. Single Number II 、 260. Single Number III(剑指offer40 数组中只出现一次的数字)
136. Single Number 除了一个数字,其他数字都出现了两遍. 用亦或解决,亦或的特点:1.相同的数结果为0,不同的数结果为1 2.与自己亦或为0,与0亦或为原来的数 class Solu ...