Delta定制
Nop平台与其他开发平台相比,一个显著的特异之处在于它支持在完全不修改平台源码的情况下,通过Delta定制机制实现对平台功能的深度定制。
整体架构说明,参见delta-customization.md
定制bean
Nop平台中所有的bean都由NopIoC容器统一管理,它是一个语法类似Spring1.0,但是增加了类似SpringBoot的条件装配和自动装配机制的,完全声明式的一个IoC容器。
为了避免命名冲突,Nop平台内置的bean的id一般以nop为前缀,例如nopJdbcTemplate等
查看bean的定义
为了定制bean,首先可以查看_dump目录下的/nop/main/beans/merged-app.beans.xml文件。系统在调试模式下启动时会自动将所有被激活的bean的配置都输出
到这个调试文件中。通过查看这个文件,可以获知系统中所有使用到的bean的配置细节。
<!--LOC:[15:6:0:0]/nop/auth/beans/auth-service.beans.xml-->
<bean class="io.nop.auth.service.auth.DefaultActionAuthChecker" id="$DEFAULT$nopActionAuthChecker" ioc:aop="false"
name="nopActionAuthChecker">
<property name="siteMapProvider" ext:autowired="true">
<ref bean="nopSiteMapProvider" ext:resolved-loc="[13:6:0:0]/nop/auth/beans/auth-service.beans.xml"
ext:resolved-trace="/nop/auth/beans/app-service.beans.xml"/>
</property>
</bean>
这个文件中可以看出每个bean所在的源文件位置,例如上面的示例表示
- 名为nopActionAuthChecker的bean在auth-service.beans.xml文件中定义。
- siteMapProvider属性使用@Inject注解自动注入,实际注入的bean为 nopSiteMapProvider
- nopSiteMapProvider的源码位置为 auth-service.beans.xml文件的第13行。
id="$DEFAULT$nopActionAuthChecker"表示它定义的是一个default实现,如果存在一个具有相同名称的bean,则会自动替换这个实现。
nopActionAuthChecker的原始定义如下,节点上标记了ioc:default='true'。如果存在另外一个bean的name也是nopActionAuthChecker,则会自动 覆盖这个缺省定义。ioc:default的作用类似于SpringBoot中的ConditionalOnMissingBean
<bean id="nopActionAuthChecker" class="io.nop.auth.service.auth.DefaultActionAuthChecker" ioc:default="true"/>
替换或者删除系统中的bean定义
如果需要替换系统中bean的定义,只需要在/_vfs/_delta/default目录下定义同名的beans.xml文件,然后在其中使用x:extends机制来定制
<beans x:schema="/nop/schema/beans.xdef" xmlns:x="/nop/schema/xdsl.xdef"
x:extends="super">
<!-- 可以通过这种方式删除系统中内置的bean的定义-->
<bean id="nopActionAuthChecker" x:override="remove" />
</beans>
也可以替换bean的实现类,例如
<beans x:schema="/nop/schema/beans.xdef" xmlns:x="/nop/schema/xdsl.xdef"
x:extends="super">
<!-- 这里的定义会和平台中的定义节点进行合并 -->
<bean id="nopActionAuthChecker" class="xxx.MyActionAuthChecker" />
</beans>