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 区分开来,因此这应该可以正常工作。
我正在使用 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 区分开来,因此这应该可以正常工作。