如何将属性注入到 JPA entity 中

1、定义一个注入的接口

  public interface DependencyInjector {
	void performInjection(Object existingBean);
 }

 

2、定义一个实现了注入接口 DependencyInjector 及 BeanFactoryAware 的属性注射器 bean

public class AutowireDependencyInjector implements DependencyInjector, BeanFactoryAware{

	  private AutowireCapableBeanFactory beanFactory;

	  public void setBeanFactory(BeanFactory beanFactory) {
	    if (!(beanFactory instanceof AutowireCapableBeanFactory))
	      throw new IllegalArgumentException("BeanFactory must" + " be an AutowireCapableBeanFactory");
	    this.beanFactory = (AutowireCapableBeanFactory) beanFactory;
	  }

	  //将属性(spring中注册过的)绑定到 bean 上
	  public void performInjection(Object existingBean) {
	    beanFactory.autowireBeanProperties(existingBean,
	      AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, false);
	  }
}

 

3、定义一个监听器,监听 entity 生成后不同的事件类型,然后将属性注入

public class DependencyInjectionEntityListener {

	  private static DependencyInjector _injector;
		
	  public static void setInjector(DependencyInjector injector) {
	    _injector = injector;
	  }

	  //如果需要监听不同的事件,以下方式类推
	  @PrePersist
	  @PostLoad
	  public void performInjection(Object entity) {
	    if (_injector == null)
	      throw new IllegalStateException("EntityListener cannot" 
	      + " be used without an injector");
	    _injector.performInjection(entity);
	  }	
}
 

 

4、定义一个监听配置类,将属性注射器注入到监听器中

public class DependencyInjectionEntityListenerConfigurer implements InitializingBean{
	
	  private DependencyInjector injector;

	  public void setInjector(DependencyInjector injector) {
	    if (injector == null)
	      throw new NullPointerException("Injector cannot be null");
	    this.injector = injector;
	  }

	  public void afterPropertiesSet() throws Exception {
	    DependencyInjectionEntityListener.setInjector(injector);
	  }
}
 

5、entity 类使用

@Entity
// 自定义的 listener
@EntityListeners(DependencyInjectionEntityListener.class)
public class DomainObject {
  @Id 
  private long id;
  DomainObject() {
  }
  public DomainObject(long id) {
    this.id = id;
  }
  public long getId() {
    return id;
  }
  
  //需要注入的属性
  @Transient
  private SomeService service;
  public void setService(SomeService service) {
    this.service = service;
  }
}
 

关键点在于 AutowireCapableBeanFactory.autowireBeanProperties(existingBean, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, false);, 将spring中的属性注入到 JPA entity, 以及用到了JPA 的  EntityListeners.

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值