具有Aspects的Java中的Mixin –用于Scala特性示例
Scala特征允許將新行為混合到一個類中。 考慮兩個特征,可以向JPA實體添加審核和與版本相關的字段:
現在將“ 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的Java中的Mixin –用于Scala特性示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 红绿灯时间设置标准(红绿灯时间设置标准是
- 下一篇: ae86是什么梗(AE86车上的字是什么