Spring Transaction#TransactionalEventListener

来源:互联网 发布:python的multiply函数 编辑:程序博客网 时间:2024/06/06 04:31

TransactionalEventListener本质上是一个@EventListener,Spring Tx针对使用Transaction时进行了贴别的处理;处理过程可见ApplicationListenerMethodTransactionalAdapter;

在TransactionalEventListener中可以配置一个TransactionPhase参数;ApplicationListenerMethodTransactionalAdapter的处理流程就是为所有带TransactionalEventListener注解的方法创建一个ApplicationListenerMethodTransactionalAdapter对象,然后放到Spring ApplicationContext中;

在ApplicationListenerMethodTransactionalAdapter中会处理TransactionalEventListener注解的信息,将EventListener标识的方法的执行时机与jta中的Synchronization绑定在一起;绑定操作是通过实现了Spring Tx TransactionSynchronizationAdapter类的TransactionSynchronizationEventAdapter类来实现的;

下面是此类的实现:

private static class TransactionSynchronizationEventAdapter extends TransactionSynchronizationAdapter {        private final ApplicationListenerMethodAdapter listener;        private final ApplicationEvent event;        private final TransactionPhase phase;        public TransactionSynchronizationEventAdapter(ApplicationListenerMethodAdapter listener,                ApplicationEvent event, TransactionPhase phase) {            this.listener = listener;            this.event = event;            this.phase = phase;        }        @Override        public int getOrder() {            return this.listener.getOrder();        }        @Override        public void beforeCommit(boolean readOnly) {            if (this.phase == TransactionPhase.BEFORE_COMMIT) {                processEvent();            }        }        @Override        public void afterCompletion(int status) {            if (this.phase == TransactionPhase.AFTER_COMMIT && status == STATUS_COMMITTED) {                processEvent();            }            else if (this.phase == TransactionPhase.AFTER_ROLLBACK && status == STATUS_ROLLED_BACK) {                processEvent();            }            else if (this.phase == TransactionPhase.AFTER_COMPLETION) {                processEvent();            }        }        protected void processEvent() {            this.listener.processEvent(this.event);        }    }
原创粉丝点击