spring 引导 JPA 存储库 类 的 Byte Buddy Runtime 生成

Byte Buddy Runtime generation for spring boot JPA repository classes

我正在使用 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 引导 Jpa 库,如下所示,

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

public interface PersonRepository extends JpaRepository <Person, Long> {

}

如何创建具有通用属性的界面。这也能(使用动态代码生成)持久化 Person 对象吗?

您可以使用 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();

class 生成的 Byte Buddy 无法与 javac 生成的 Byte Buddy 区分开来,因此这应该可以正常工作。