一种介入对象内部行为的方法及相关装置与流程

文档序号:14303571阅读:262来源:国知局
一种介入对象内部行为的方法及相关装置与流程

本发明属于计算机技术领域,具体为一种介入对象内部行为的方法及相关装置。



背景技术:

对象关系映射(orm)是指在对象模型与关系模型之间实施双向映射。在将对象映射为关系数据时为了有针对性地修改关系字段需要知道对象的哪些属性(attribute)发生过修改,即更改跟踪;在将关系数据映射为对象时,为提升性能通常不是在加载对象时随之加载其关联,而是延后到对象活动期间关联被访问时才加载,即延迟加载。

作为独立于具体业务系统的第三方orm程序,实现更改跟踪和延迟加载面临着一个障碍,即由于对象系统在设计时会遵循面向对象的封装性原则,修改属性和访问关联均属于对象内部行为,外部的orm程序是无法感知这些行为的。

因此,必须发明一种介入对象内部行为的方法,以便orm程序可以在不破坏封装性原则的前提下捕获对象的内部行为。



技术实现要素:

发明一种介入对象内部行为的方法,以便处于对象系统外部的orm程序可以在不破坏面向对象封装性原则的前提下介入对象内部行为,从而实现对象属性更改跟踪和关联延迟加载。所采用的技术方案如下。

1.一种介入对象内部行为的方法,其具体方法步骤如下:

作为输入参数,指定被介入对象的类型,同时指明需要介入的行为及其触发器(一个或多个),如果多个行为共用一个触发器,还需指明这些行为的介入优先级;

实现介入者;

定义介入接口;

自动生成派生代理类;

实例化派生代理类;

经由介入接口将介入者注入对象内部。

进一步地,所述行为触发器可以为以下三种类型:(1)对象的公有方法(public-method);(2)公有的属性get访问器(public-property-getter);(3)公有的属性set访问器(public-property-setter)。

进一步地,所述派生代理类应当实现所述介入接口,并按以下步骤重写行为触发器:

前置介入调用;

调用原始类型定义的触发器逻辑;

后置介入调用。

进一步地,所述介入调用,其特征在于它是按如下步骤生成的调用清单:

按触发器对第一步输入的介入行为进行分类汇总,每一个触发器对应一个或多个行为;

按介入优先级对介入行为从高到低排序;

顺次对每一个行为调用介入者定义的介入动作,如果定义了多个介入动作,则按定义顺序调用。

2.一种关联延迟加载装置,包含:

关联加载器作为介入者,负责从数据库中加载关联;

代理生成单元,负责生成派生代理类并将其注册到对象管理单元;

对象管理单元,负责实例化派生代理类以创建对象,并将关联加载器作为介入者经由介入接口注入到对象内部;

装置接口,一方面负责接收装置使用者输入的参数并将其转发给代理生成单元;另一方面负责接收使用者的委托,请求对象管理单元创建对象并将对象返回给使用者。

进一步地,所述派生代理类对关联加载器实施前置介入调用。

3.一种属性更改跟踪装置。根据所述关联延迟加载装置,将其包含的关联加载器替换为用于记录对象属性更改的更改跟踪器,同时将派生代理类对其前置介入调用改为后置介入调用,即可得到一种属性更改跟踪装置。

本发明的有益效果是,在不破坏面向对象封装性原则的前提下,外部程序可以在对象内部行为之前或之后执行介入动作,从而实现关联延迟加载和属性更改跟踪,明显提升orm程序的性能。

附图说明

图1是本发明方法中介入对象内部行为的原理示意图。

图2是本发明实施例提供的一种关联延迟加载装置。

图3是本发明实施例提供的一种属性更改跟踪装置。

具体实施方式

以下结合本发明原理附图和实施例对本发明作进一步描述,实施例的描述仅为便于理解和应用本发明,而非对本发明保护的限制。

原理介绍:从作用效果上看,对象行为可以分为两种,一种是会对其它对象产生影响的行为,如向其它对象发出调用消息、引发事件等等。另一种是作用效果仅限于其自身内部,外界无法感知到的行为,称为内部行为,如访问某个关联、修改某个属性(attribute)的值等。本发明仅涉及对象内部行为。

虽然对象内部行为外界无法感知,但内部行为都是在外界触发下发生的。外界触发对象行为必须经由对象公开的方法或属性访问器来实施,这些方法和属性访问器称为对象行为触发器。本发明即利用行为触发器介入对象内部行为,在内部行为开始之前或结束之后执行额外动作。该额外动作称为介入动作,如果在对象行为开始前执行则称为前置介入动作,在行为结束后执行则称为后置介入动作。具体原理如图1所示。

实施例1

本发明以图1所示的原理为基础,创立了一套方法用于介入对象内部行为,在行为之前或之后执行介入动作,具体实现步骤如下:

第一步,作为输入参数,指定被介入对象的类型,同时指明需要介入的行为及其触发器(一个或多个),如果多个行为共用一个触发器,还需指明这些行为的介入优先级。数据结构定义如下:

structintervenedbehavior

{

stringbehaviorid;//要介入的行为的识别标识

behaviortrigger[]triggers;//行为触发器数组

bytepriority;//介入优先级

},

其中,behaviortrigger为表示行为触发器的数据结构,定义如下:

structbehaviortrigger

{

stringname;//触发器名称,即方法或属性访问顺的名称

bytetype;//触发器类型,0表示方法,1表示get访问器,2表示set访问器

}。

行为触发器可以为以下三种类型:(1)对象的公有方法(public-method);(2)公有的属性get访问器(public-property-getter);(3)公有的属性set访问器(public-property-setter)。

第二步,实现介入者。介入者是指执行具体介入动作的程序模块或构件,根据实际应用场景可定义一个或多个介入动作。例如,在orm场景中的介入者可按如下方式实现:

classiintervener

{

voidtracechange(objectobj,stringattrname)

{

//记录属性变更

}

voidloadassociation(objectobj,stringassoname)

{

//从数据库加载关联

},

其中,tracechange为后置介入动作,loadassociation为前置介入动作。

第三步,定义介入接口,该接口供对象管理程序将介入者注入到对象内部。该接口定义如下:

interfaceiintervene

{

voidregisterintervener(objectintervener);

}

第四步,自动生成派生代理类,该代理类继承自对象的原始类型,并实现上述介入接口。

该代理类需要重写(override)第一步所述的行为触发器,重写逻辑如下:

首先,前置介入调用;

然后,调用原始类型定义的触发器逻辑;

最后,后置介入调用。

所述前置介入调用和后置介入调用可能不止一次调用,而是按优先级排序的调用清单,其生成方法如下:

首先,按触发器对第一步输入的所有intervenedbehavior进行分类汇总,每一个触发器对应一个或多个行为,每个行为按其介入优先级从高到低排序,数据结构如下:

structtriggertobehavior

{

behaviortriggertrigger;//触发器

string[]behaviorids;//行为识别标识构成的有序数组

};

然后,顺次对behaviorids中的每一个行为调用介入者定义的介入动作。如果介入者定义了多个介入动作,则按定义顺序依次调用。假定behaviorids包含n个行为,介入者定义了k个前置介入动作和s个后置介入动作,那么前置调用清单的项数为n*k,后置调用清单的项数为n*s。

自动生成代理类属于较为成熟的技术,通常采取以下三种方式:一是采用汇编语言编写指令;二是采用高级语言编写代码,然后调用该语言的编译器生成机器指令;三是采用java和.net等开发平台提供的反射发出技术生成。由于本项工作不属于本发明的内容,故不详述。

第五步,实例化派生代理类创建对象。

第六步,经由介入接口将介入者注入上一步创建的对象内部。

实施例2

如图2所示,本实施例提供了一种根据所述对象内部行为介入方法实现的关联延迟加载装置,该装置的用途是在对象内部关联被访问时即时从数据库加载关联,从而不必在对象加载时加载所有关联。该装置包含四个部分。

关联加载器作为介入者,负责从数据库中加载关联。

代理生成单元负责按照所述对象内部行为介入方法第四步所述的方法生成派生代理类,并将其注册到对象管理单元。所述派生代理类对所述关联加载器实施前置介入调用。

对象管理单元负责实例化派生代理类以创建对象,并将所述关联加载器作为介入者经由介入接口注入到对象内部。

装置接口一方面负责接收装置使用者输入的参数并将其转发给代理生成单元,此参数指定被介入对象的类型和要介入的行为及其触发器。另一方面负责接收使用者的委托,请求对象管理单元创建对象并将对象返回给使用者。

实施例3

如图3所示,本实施例提供了一种根据所述对象内部行为介入方法实现的属性更改跟踪装置,该装置的用途是当对象的属性发生更改时记录被更改的属性,以便在将对象映射为关系数据时有针对性的修改字段。

该装置根据所述关联延迟加载装置做出以下两点更改得出:(一)将其包含的关联加载器替换为用于记录对象属性更改的更改跟踪器;(二)将派生代理类对关联加载器的前置介入调用改为对更改跟踪器的后置介入调用。

以上所述仅是本发明的优选应用实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1