aspects

Scala特征允许将新行为混合到一个类中。 考虑两个特征,可以向JPA实体添加审核和与版本相关的字段:

package mvcsample.domainimport javax.persistence.Version
import scala.reflect.BeanProperty
import java.util.Datetrait Versionable {@Version@BeanPropertyvar version: Int = _
}trait Auditable {@BeanPropertyvar createdAt: Date = _@BeanPropertyvar updatedAt: Date = _
}

现在将“ Versionable”和“ Auditable”及其成员实体中的字段和行为混合在一起:

@Entity
@Table(name = 'members')
class Member(f: String, l: String) extends BaseDomain with Auditable with Versionable {def this() = this(null, null)@BeanPropertyvar first: String = f@BeanPropertyvar last: String = l@OneToMany(fetch = FetchType.EAGER, mappedBy = 'member')@BeanPropertyvar addresses: java.util.List[Address] = _
}trait BaseDomain {@BeanProperty@GeneratedValue(strategy = GenerationType.AUTO)@Column(name = 'id')@Idvar id: Long = 0
}

现在,上面的Member类将具有BaseDomain类的行为,并且将具有Versionable特性和Auditable特性的行为。 普通的Java无法实现这种混合,因为具有字段和行为的特征等同于一个抽象(或具体)类,而Java只允许从1个基类派生。 但是,使用AspectJ可以实现等效的mixin。 考虑使用Aspectj语言定义的以下方面:

package mvcsample.aspect;import javax.persistence.Column;
import javax.persistence.Version;
import mvcsample.annot.Versioned;public interface Versionable {static aspect VersionableAspect {declare parents: @Versioned  mvcsample.domain.* implements Versionable;@Version@Column(name = 'version')private Integer Versionable.version;    public Integer Versionable.getVersion() {return this.version;}public void Versionable.setVersion(Integer version) { this.version = version;}}
}package mvcsample.aspect;import java.util.Date;
import javax.persistence.Column;import mvcsample.annot.Audited;
public interface Auditable {static aspect AuditableAspect {declare parents: @Audited mvcsample.domain.* implements Auditable ;@Column(name='created_at')private Date Auditable.createdAt;@Column(name='updated_at')private Date Auditable.updatedAt;public Date Auditable.getCreatedAt(){return this.createdAt;}public void Auditable.setCreatedAt(Date createdAt) {this.createdAt = createdAt;}public Date Auditable.getUpdatedAt(){return this.updatedAt;}public void Auditable.setUpdatedAt(Date updatedAt) {this.updatedAt = updatedAt;}}
}

“声明父母:@Versioned mvcsample.domain。*实现了Versionable;” Aspectj构造将'Versionable'接口作为父级添加到包'mvcsampple.domain'中以@Versioned注释的任何类的父类中,类似于用于'Auditable'的类。 然后,该方面着手将字段添加到Versionable接口中,该接口随后又将字段添加(混合)到目标实体类中,这样,与Audit相关和Version相关的字段和方法就混合到了实体类中。 定义了这两个方面之后,目标实体类将如下所示:

@Entity
@Table(name="members")
@Access(AccessType.FIELD)
@Versioned
@Audited
public class Member extends BaseDomain{public Member(){}public Member(String first, String last){this.first = first;this.last = last;}private String first;@Size(min=1)private String last;@OneToMany(fetch=FetchType.EAGER, mappedBy="member")private List<address>addresses = new ArrayList<>();.....
}
</address>

在Versionable和Auditable方面中定义的字段和行为将混入该实体(更一般地,混入具有@Versioned和@Audited批注的任何实体)。 可能不如Scala特质那么干净,但效果很好。

参考: Java与Aspects中的Mixin –在all和其他博客上获取我们JCG合作伙伴 Biju Kunjummen 的Scala特性示例 。

翻译自: https://www.javacodegeeks.com/2013/01/mixin-in-java-with-aspects-for-a-scala-traits-sample.html

aspects

aspects_具有Aspects的Java中的Mixin –用于Scala特性示例相关推荐

  1. 具有Aspects的Java中的Mixin –用于Scala特性示例

    Scala特征允许将新行为混合到一个类中. 考虑两个特征,可以向JPA实体添加审核和与版本相关的字段: package mvcsample.domainimport javax.persistence ...

  2. java解析xml实例_在java中使用dom解析xml的示例分析

    本篇文章介绍了,在java中使用dom解析xml的示例分析.需要的朋友参考下 dom是个功能强大的解析工具,适用于小文档 为什么这么说呢?因为它会把整篇xml文档装载进内存中,形成一颗文档对象树 总之 ...

  3. groovy 使用java类_深入学习java中的Groovy 和 Scala 类

    前言 Java 传承的是平台,而不是语言.有超过 200 种语言可以在 JVM 上运行,它们之中不可避免地会有一种语言最终将取代 Java 语言,成为编写 JVM 程序的最佳方式.本系列将探讨三种下一 ...

  4. Java中使用ArrayList的10个示例–教程

    Java中的ArrayList是HashMap之后最常用的集合类. Java ArrayList表示一个可自动调整大小的数组,并用于代替数组. 由于创建数组后我们无法修改数组的大小,因此我们更喜欢在J ...

  5. java 抽象 属性_在java中如何定义一个抽象属性示例详解

    前言 本文主要给大家介绍的是在java中定义一个抽象属性的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: Abstract关键字通常被用于类和方法,用来把某些行为的实现委托给 ...

  6. cdate在java中_Java Calendar.add方法代码示例

    本文整理汇总了Java中java.util.Calendar.add方法的典型用法代码示例.如果您正苦于以下问题:Java Calendar.add方法的具体用法?Java Calendar.add怎 ...

  7. var是java关键字,Java 中的 var 关键字及代码示例

    本文将介绍是 Java 中的 var 关键字以及如何使用它. 从 Java 10(JDK 10)开始,var 关键字已添加到 Java 语言中,支持局部变量类型推断,在该功能中,Java 编译器可根据 ...

  8. 在java中关于枚举类型的特性_java枚举类型小结

    JDK5.0之前,我们一般选择使用 interface 来保存常量组,以此来弥补 JDK 中没有枚举类型的缺陷,从JDK5.0开始,Sun引进了一个全新的关键字 enum 来定义一个枚举类.同inte ...

  9. java中countinue,.random(用于产生一个随机数)入门可看

    1.countinue:用在循环中,基于条件控制,跳过其次循环体内容的执行,继续下一次的执行 break:用在循环中,基于条件控制,终止循环体内容的执行,也就是结束当前的整个循环 eg:public ...

最新文章

  1. c语言密钥短语密码得到代替字母表,c语言程序设计竞赛题及其答案
  2. R学习笔记之五:数据操作
  3. 强制解除占用端口,最快速方便的解除占用端口,端口占用解决方案大全
  4. 稳定的手机端服务器,[Ktor] 实现移动端的 Ktor 服务器
  5. Caffe官方教程翻译(7):Fine-tuning for Style Recognition
  6. 深入Eureka/Feign/Hystrix原理学习(1)
  7. 仓库中应用的计算机设备有哪些,智能仓储设备系统中有哪些常见的应用工具
  8. 用PHP生成word文件
  9. opencv图像深度-1_OpenCV空间AI竞赛之旅(第1部分-初始设置+深度)
  10. CF528C. Data Center Drama(欧拉回路,构造)
  11. 国内MCU厂商也开始卷了
  12. 看到这一切,我忍俊不禁
  13. android屏幕亮度测试,屏幕亮度与可视角度测试_手机Android频道-中关村在线
  14. sql 判断分钟是偶数数据_SQL注入数据库类型判断
  15. snmptrap的使用方法
  16. Socket编程模型之完成端口模型
  17. 中国建设工程造价管理系统 http://zaojiasys.jianshe99.com/cecaopsys/
  18. Chloe 蔻依 恋旅
  19. STK10与MATLAB互联
  20. 什么是激光波长、激光功率和激光亮度?

热门文章

  1. 面试时如何介绍自己的项目经验
  2. 达到年薪 40W 必需掌握的技术。
  3. Git安装及配置5分钟快速教程
  4. 【php】php对mysql的连接操作【mysql】
  5. 项目参与度较低怎么办?
  6. java中判断 101-200 之间有多少个素数,并输出所有的素数
  7. Mybatis主要内容
  8. 不同范数下的余弦定理_第06题 | 从源头追溯「余弦定理」amp; 文理科知识点的异同...
  9. 基于centos8搭建zookeeper集群
  10. soapui 测试soap_使用SoapUI调用不同的安全WCF SOAP服务-基本身份验证,第二部分