/*
* Copyright 2008-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.repository.core.support;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.data.repository.Repository;
import org.springframework.data.repository.util.TxUtils;
import org.springframework.lang.Nullable;
import org.springframework.transaction.interceptor.TransactionInterceptor;
import org.springframework.util.Assert;
Extension of RepositoryFactoryBeanSupport
to add transactional capabilities to the repository proxy. Will register a TransactionalRepositoryProxyPostProcessor
that in turn adds a TransactionInterceptor
to the repository proxy to be created. Author: Oliver Gierke
/**
* Extension of {@link RepositoryFactoryBeanSupport} to add transactional capabilities to the repository proxy. Will
* register a {@link TransactionalRepositoryProxyPostProcessor} that in turn adds a {@link TransactionInterceptor} to
* the repository proxy to be created.
*
* @author Oliver Gierke
*/
public abstract class TransactionalRepositoryFactoryBeanSupport<T extends Repository<S, ID>, S, ID>
extends RepositoryFactoryBeanSupport<T, S, ID> implements BeanFactoryAware {
private String transactionManagerName = TxUtils.DEFAULT_TRANSACTION_MANAGER;
private @Nullable RepositoryProxyPostProcessor txPostProcessor;
private @Nullable RepositoryProxyPostProcessor exceptionPostProcessor;
private boolean enableDefaultTransactions = true;
Creates a new TransactionalRepositoryFactoryBeanSupport
for the given repository interface. Params: - repositoryInterface – must not be null.
/**
* Creates a new {@link TransactionalRepositoryFactoryBeanSupport} for the given repository interface.
*
* @param repositoryInterface must not be {@literal null}.
*/
protected TransactionalRepositoryFactoryBeanSupport(Class<? extends T> repositoryInterface) {
super(repositoryInterface);
}
Setter to configure which transaction manager to be used. We have to use the bean name explicitly as otherwise the qualifier of the Transactional
annotation is used. By explicitly defining the transaction manager bean name we favour let this one be the default one chosen. Params: - transactionManager –
/**
* Setter to configure which transaction manager to be used. We have to use the bean name explicitly as otherwise the
* qualifier of the {@link org.springframework.transaction.annotation.Transactional} annotation is used. By explicitly
* defining the transaction manager bean name we favour let this one be the default one chosen.
*
* @param transactionManager
*/
public void setTransactionManager(String transactionManager) {
this.transactionManagerName = transactionManager == null ? TxUtils.DEFAULT_TRANSACTION_MANAGER : transactionManager;
}
Configures whether to enable the default transactions configured at the repository base implementation class.
Params: - enableDefaultTransactions – the enableDefaultTransactions to set
/**
* Configures whether to enable the default transactions configured at the repository base implementation class.
*
* @param enableDefaultTransactions the enableDefaultTransactions to set
*/
public void setEnableDefaultTransactions(boolean enableDefaultTransactions) {
this.enableDefaultTransactions = enableDefaultTransactions;
}
Delegates RepositoryFactorySupport
creation to doCreateRepositoryFactory()
and applies the TransactionalRepositoryProxyPostProcessor
to the created instance. See Also:
/**
* Delegates {@link RepositoryFactorySupport} creation to {@link #doCreateRepositoryFactory()} and applies the
* {@link TransactionalRepositoryProxyPostProcessor} to the created instance.
*
* @see org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport #createRepositoryFactory()
*/
@Override
protected final RepositoryFactorySupport createRepositoryFactory() {
RepositoryFactorySupport factory = doCreateRepositoryFactory();
RepositoryProxyPostProcessor exceptionPostProcessor = this.exceptionPostProcessor;
if (exceptionPostProcessor != null) {
factory.addRepositoryProxyPostProcessor(exceptionPostProcessor);
}
RepositoryProxyPostProcessor txPostProcessor = this.txPostProcessor;
if (txPostProcessor != null) {
factory.addRepositoryProxyPostProcessor(txPostProcessor);
}
return factory;
}
Creates the actual RepositoryFactorySupport
instance. Returns:
/**
* Creates the actual {@link RepositoryFactorySupport} instance.
*
* @return
*/
protected abstract RepositoryFactorySupport doCreateRepositoryFactory();
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.BeanFactoryAware#setBeanFactory(org.springframework.beans.factory.BeanFactory)
*/
public void setBeanFactory(BeanFactory beanFactory) {
Assert.isInstanceOf(ListableBeanFactory.class, beanFactory);
super.setBeanFactory(beanFactory);
ListableBeanFactory listableBeanFactory = (ListableBeanFactory) beanFactory;
this.txPostProcessor = new TransactionalRepositoryProxyPostProcessor(listableBeanFactory, transactionManagerName,
enableDefaultTransactions);
this.exceptionPostProcessor = new PersistenceExceptionTranslationRepositoryProxyPostProcessor(listableBeanFactory);
}
}