使用 AspectJ (AOP) 持久化到数据库






2.75/5 (4投票s)
2004 年 8 月 30 日
6分钟阅读

43450

583
在 AspectJ 中使用面向切面编程 (AOP) 的一种将对象持久化到数据库的方法。
使用 AspectJ (AOP) 持久化到数据库摘要 作者 日期 信号强度 环境 |
|
![]() ![]() ![]() ![]() ![]() 引言能够在短时间内为类的对象提供持久化功能,这充分展现了 Aspect 的强大能力。因为我们可以为那些本身不具备此行为的对象添加此行为,而无需更改它们的代码。 抽象 Aspect首先开发的是一个名为 Persistence 的抽象 Aspect,它将允许被其他 Aspect 扩展。这个抽象 Aspect 包含了定义 Aspect 在给定时间内行为的所有抽象切点。 Figura 1. Persistencia.aj package persistencia_Aspect; import java.sql.*; /** * @author mlorente@programemos.com */ abstract aspect Persistencia extends CapaDatos { declare parents : FormularioCliente implements ObjetosRelacion; Persistencia() { super(); System.out.println("constructor Persistencia"); } abstract pointcut quieroLeer(); abstract pointcut quieroGrabar(); abstract pointcut quieroBorrar(); after() : quieroLeer() { leer(); } before() : quieroGrabar() { grabar(); } before() : quieroBorrar() { borrar(); } public void FormularioCliente.addObjetoRelacion(Object obj) { addObjeto((Cliente)obj); } } 首先我们可以看到以下代码 declare parents : FormularioCliente implements ObjetosRelacion. 这里指示 FormularioCliente 类(在更完善的实现中,一个表单将是一个代表数据库的类)必须实现 ObjetosRelacion 接口。 在 Aspect 声明的最后可以看到以下代码 public void FormularioCliente.addObjetoRelacion(Object obj) { addObjeto((Cliente)obj); } 此处实现了包含 ObjetosRelacion 接口的方法。 abstract pointcut quieroLeer(); abstract pointcut quieroGrabar(); abstract pointcut quieroBorrar(); after() : quieroLeer() { leer(); } before() : quieroGrabar() { grabar(); } before() : quieroBorrar() { borrar(); } 声明了三个抽象切点,这些切点将在扩展此 Aspect 的 Aspect 中被重写。 客户端 Aspect进行这个小型项目的想法之一是,只需编写最少的代码即可为特定类的对象提供持久化。而与 PersistenciaCliente Aspect 类似的 Aspect 将是我们编写以提供所需对象持久化的代码。 Figura 2. PersistenciaCliente.aj package persistencia_Aspect; import java.sql.*; /** * @author mlorente@programemos.com */ aspect PersistenciaCliente extends Persistencia { PersistenciaCliente() { System.out.println("constructor PersistenciaCliente"); } pointcut quieroLeer() : execution(* *.leer_click()); pointcut quieroGrabar() : execution(* *.grabar_click()); pointcut quieroBorrar() : execution(* *.borrar_click()); public String[] clave() { String[] a = new String[] {"IdCliente={$getId}"}; return a; } public String sqlIdentityField() { return "{$setId}"; } public String sqlSelect() { return "SELECT IdCliente{$setId}, Nombre{$setNombre}, Email{$setEmail} FROM Cliente"; } public String sqlUpdate() { return "UPDATE Cliente SET Nombre='{$getNombre}', Email='{$getEmail}'"; } public String sqlInsert() { return "INSERT INTO Cliente(Nombre, Email) VALUES('{$getNombre}', '{$getEmail}')"; } public String sqlDelete() { return "DELETE FROM Cliente"; } } 在查看完构成 PersistenciaCliente Aspect 的所有代码后,我们将详细介绍它。 pointcut quieroLeer() : execution(* *.leer_click()); pointcut quieroGrabar() : execution(* *.grabar_click()); pointcut quieroBorrar() : execution(* *.borrar_click()); 我们可以推测这是重写 Aspect Persistence 中定义的抽象切点的代码。我们的猜测是对的,因为它确实是这样做的。正如第一个切点所示,我们希望在捕获 leer_click 方法的执行时执行该切点。 测试最后,我们只需要查看将允许我们进行适当测试的类。有必要提到以下代码 formulario.addObjetoRelacion(cliente),因为对象将它们关联到 FormularioCliente 类。必须注意的是,FormularioCliente 类不包含该方法,而是通过抽象 Aspect Persistence 提供的。 package persistencia_Aspect; /** * @author mlorente@programemos.com */ import java.lang.reflect.*; public class Test { public static void main(String[] args) { FormularioCliente formulario=new FormularioCliente(); Cliente cliente=new Cliente(); cliente.setId(1); Cliente cliente2=new Cliente(); cliente2.setId(2); formulario.addObjetoRelacion(cliente); formulario.addObjetoRelacion(cliente2); formulario.leer_click(); System.out.println("nombre del 1: " + cliente.getNombre() + " ruta: " + cliente.getEmail()); System.out.println("nombre del 2: " + cliente2.getNombre() + " ruta: " + cliente2.getEmail()); cliente.setNombre("nombre del 1 cambiado"); formulario.grabar_click(); cliente2.setNombre("nombre del 2 cambiado"); Cliente cliente3=new Cliente(); cliente3.setNombre("nuevo"); cliente3.setEmail("Nueva"); formulario.addObjetoRelacion(cliente3); formulario.borrar_click(); } } 结论显然,这不是为类的对象提供持久化的最终解决方案,但它提供了多种实现方法之一。 |