具有Aspects的Java中的Mixin –用于Scala特性示例
Scala特征允許將新行為混合到一個(gè)類中。 考慮兩個(gè)特征,可以向JPA實(shí)體添加審核和與版本相關(guān)的字段:
現(xiàn)在將“ Versionable”和“ Auditable”及其成員實(shí)體中的字段和行為混合在一起:
@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 }現(xiàn)在,上面的Member類將具有BaseDomain類的行為,并且將具有Versionable特性和Auditable特性的行為。 普通的Java無(wú)法實(shí)現(xiàn)這種混合,因?yàn)榫哂凶侄魏托袨榈奶卣鞯韧谝粋€(gè)抽象(或具體)類,而Java只允許從1個(gè)基類派生。 但是,使用AspectJ可以實(shí)現(xiàn)等效的mixin。 考慮使用Aspectj語(yǔ)言定義的以下方面:
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。*實(shí)現(xiàn)了Versionable;” Aspectj構(gòu)造將'Versionable'接口作為父級(jí)添加到包'mvcsampple.domain'中以@Versioned注釋的任何類中,類似于'Auditable'的類。 然后,該方面著手將字段添加到Versionable接口中,該接口又最終將字段添加(混合)到目標(biāo)實(shí)體類中,這樣,與Audit相關(guān)和Version相關(guān)的字段和方法將被混合到實(shí)體類中。 定義了這兩個(gè)方面后,目標(biāo)實(shí)體類將如下所示:
@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方面中定義的字段和行為將混入該實(shí)體(更一般地,混入具有@Versioned和@Audited批注的任何實(shí)體)。 可能不如Scala特質(zhì)那么干凈,但效果很好。
參考: 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
總結(jié)
以上是生活随笔為你收集整理的具有Aspects的Java中的Mixin –用于Scala特性示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 红绿灯时间设置标准(红绿灯时间设置标准是
- 下一篇: 40个Java Collections面