用于Spring启动JPA存储库类的Byte Buddy Runtime生成

时间:2017-01-12 14:38:35

标签: java spring-boot byte-buddy

我正在使用 Byte Buddy 来生成JPA实体和JPA存储库。我能够生成JPA实体,但无法继续生成相应的JPA存储库。以下是代表Person实体的代码,

import javax.persistence.*;
@Entity
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    protected Person(){}

    @Override
    public String toString() {
        return String.format("Person[id=%d]",id,name);
    }
}

我可以使用Bute Buddy生成以上内容,

Class<?> type = new ByteBuddy()
    .subclass(Object.class)
    .name("Person")
    .defineField("id", Integer.class, Visibility.PRIVATE)
    .defineMethod("getId", Integer.class, Visibility.PUBLIC)
    .intercept(FieldAccessor.ofBeanProperty())
    .defineMethod("setId", void.class, Visibility.PUBLIC).withParameter(Integer.class)
    .intercept(FieldAccessor.ofBeanProperty())
    .make()
    .load(getClass().getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
    .getLoaded();

现在我想生成相应的Spring boot Jpa reporitories,如下所示,

import com.model.Person;
import org.springframework.data.jpa.repository.JpaRepository;

public interface PersonRepository extends JpaRepository <Person, Long> {

}

如何使用Generic属性创建此接口。这也可以(使用动态代码生成)来持久化Person对象吗?

1 个答案:

答案 0 :(得分:1)

您可以使用TypeDescription.Generic.Builder::parameterizedType创建通用类型:

TypeDescription.Generic genericType = TypeDescription.Generic.Builder
   .parameterizedType(JpaRepository.class, type, Long.class)
   .build();

然后,您可以将此通用类型提供给ByteBuddy::makeInterface

DynamicType dt = new ByteBuddy()
  .makeInterface(genericType)
  .name("com.model.Person")
  .make();