将Spring管理的bean注入JPA实体监听器(如Spring Data JPA),并使用自己的AuditingEntityListener

时间:2016-08-03 15:25:31

标签: java spring jpa spring-data

我想编写自己的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(还有@ConfigurableObjectFactory)用于同样的目的:

@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);
    }

    ...

}

但这个解决方案对我来说非常难看。我认为有更好的解决方案。

0 个答案:

没有答案