网站做的好不好数据,外包小程序,医院咨询男科,湛江百度seo公司aspectsScala特征允许将新行为混合到一个类中。 考虑两个特征#xff0c;可以向JPA实体添加审核和与版本相关的字段#xff1a; package mvcsample.domainimport javax.persistence.Version
import scala.reflect.BeanProperty
import java.util.Datetrait Versionable {Ver… aspects Scala特征允许将新行为混合到一个类中。 考虑两个特征可以向JPA实体添加审核和与版本相关的字段 package mvcsample.domainimport javax.persistence.Version
import scala.reflect.BeanProperty
import java.util.Datetrait Versionable {VersionBeanPropertyvar 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 fBeanPropertyvar last: String lOneToMany(fetch FetchType.EAGER, mappedBy member)BeanPropertyvar addresses: java.util.List[Address] _
}trait BaseDomain {BeanPropertyGeneratedValue(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;VersionColumn(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(namecreated_at)private Date Auditable.createdAt;Column(nameupdated_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(namemembers)
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(min1)private String last;OneToMany(fetchFetchType.EAGER, mappedBymember)private Listaddressaddresses 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.htmlaspects