我想编写自己的JPA实体监听器,它将在创建/更新/删除实体之前执行一些操作:
public class MyEntityListener {
@PrePersist
public void beforeCreate(Object entity) {
...
}
@PreUpdate
public void beforeUpdate(Object entity) {
...
}
@PreRemove
public void beforeDelete(Object entity) {
...
}
}
但是我还需要一个Spring管理的bean实例来执行这样的操作:
public class MyEntityListener {
@PrePersist
public void beforeCreate(Object entity) {
someSpringManagedBean.doSomething("Creating an entity: " + entity);
}
...
}
我知道将Spring管理的bean注入JPA实体侦听器(Injecting a Spring dependency into a JPA EntityListener)时会出现问题,因此此代码无效:
@Component
public class MyEntityListener {
@Autowired
private SomeSpringManagedBean someSpringManagedBean;
....
}
但是我发现Spring的AuditingEntityListener
使用普通的setter(还有@Configurable
和ObjectFactory
)用于同样的目的:
@Configurable
public class AuditingEntityListener {
private ObjectFactory<AuditingHandler> handler;
public void setAuditingHandler(ObjectFactory<AuditingHandler> auditingHandler) {
...
this.handler = auditingHandler;
}
@PrePersist
public void touchForCreate(Object target) {
if (handler != null) {
handler.getObject().markCreated(target);
}
}
@PreUpdate
public void touchForUpdate(Object target) {
if (handler != null) {
handler.getObject().markModified(target);
}
}
...
}
AuditingHandler
是一个Spring管理的bean(我试图在我自己的Spring管理的bean中注入它,它工作正常)。看起来Spring能够以某种方式将它提供给它自己的JPA实体监听器
我想做同样的事情,但是使用我自己的JPA实体监听器和Spring管理的bean
我知道可以在静态变量中存储对ApplicationContext
的引用,因此我可以使用它来获取所需的Spring管理的bean:
@Component
public class SomeClass implements ApplicationContextAware {
public static ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext applicationContext) {
SomeClass.applicationContext = applicationContext;
}
}
public class MyEntityListener {
@PrePersist
public void beforeCreate(Object entity) {
SomeClass.applicationContext.getBean(SomeSpringManagedBean.class)
.doSomething("Creating an entity: " + entity);
}
...
}
但这个解决方案对我来说非常难看。我认为有更好的解决方案。