Example usage for org.springframework.transaction.interceptor TransactionInterceptor setBeanFactory

List of usage examples for org.springframework.transaction.interceptor TransactionInterceptor setBeanFactory

Introduction

In this page you can find the example usage for org.springframework.transaction.interceptor TransactionInterceptor setBeanFactory.

Prototype

@Override
public void setBeanFactory(@Nullable BeanFactory beanFactory) 

Source Link

Document

Set the BeanFactory to use for retrieving PlatformTransactionManager beans.

Usage

From source file:com.google.code.guice.repository.configuration.JpaRepositoryModule.java

/**
 * Creates Spring application context based on found persistence units. Context will be initialized with multiple
 * persistence units support.//from  w w w.ja v a  2 s.  c  o m
 *
 * @param configurationManager configuration manager with persistence units configurations.
 *
 * @return initialized Spring context
 *
 * @see <a href="https://github.com/SpringSource/spring-data-jpa/blob/master/src/test/resources/multiple-entity-manager-integration-context.xml"/>
 */
protected ApplicationContext createApplicationContext(
        PersistenceUnitsConfigurationManager configurationManager) {
    GenericApplicationContext context = new GenericApplicationContext();

    String abstractEMFBeanName = "abstractEntityManagerFactory";
    context.registerBeanDefinition(abstractEMFBeanName,
            BeanDefinitionBuilder.genericBeanDefinition(LocalContainerEntityManagerFactoryBean.class)
                    .setAbstract(true).getBeanDefinition());

    Iterable<PersistenceUnitConfiguration> configurations = configurationManager.getConfigurations();
    for (PersistenceUnitConfiguration configuration : configurations) {
        String persistenceUnitName = configuration.getPersistenceUnitName();
        logger.info(String.format("Processing persistence unit: [%s]", persistenceUnitName));
        Map props = configuration.getProperties();

        String entityManagerFactoryName = "entityManagerFactory#" + persistenceUnitName;

        BeanDefinitionBuilder emfFactoryDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition()
                .setParentName(abstractEMFBeanName).addPropertyValue("persistenceUnitName", persistenceUnitName)
                .addPropertyValue("jpaProperties", props);

        // Additional EntityManagerFactory properties for Spring EMFBean initialization - s.a. jpaDialect, jpaVendorAdapter
        Map<String, Object> properties = getAdditionalEMFProperties(persistenceUnitName);
        if (properties != null) {
            for (String propertyName : properties.keySet()) {
                Object value = properties.get(propertyName);
                if (value != null) {
                    logger.info(
                            String.format("Found additional EMF property: [%s] -> [%s]", propertyName, value));
                    emfFactoryDefinitionBuilder.addPropertyValue(propertyName, value);
                }
            }
        }

        context.registerBeanDefinition(entityManagerFactoryName,
                emfFactoryDefinitionBuilder.getBeanDefinition());

        // Naming is important - it's needed for later TransactionManager resolution based on @Transactional value with persistenceUnitName
        context.registerBeanDefinition(persistenceUnitName,
                BeanDefinitionBuilder.genericBeanDefinition(JpaTransactionManager.class)
                        .addPropertyReference("entityManagerFactory", entityManagerFactoryName)
                        .getBeanDefinition());

        PlatformTransactionManager transactionManager = context.getBean(persistenceUnitName,
                PlatformTransactionManager.class);
        TransactionInterceptor transactionInterceptor = new TransactionInterceptor(transactionManager,
                createTransactionAttributeSource());
        transactionInterceptor.setBeanFactory(context);

        // Wiring components
        EntityManagerFactory emf = context.getBean(entityManagerFactoryName, EntityManagerFactory.class);
        EntityManager entityManager = SharedEntityManagerCreator.createSharedEntityManager(emf, props);
        configuration.setEntityManager(entityManager);
        configuration.setEntityManagerFactory(emf);
        configuration.setTransactionManager(transactionManager);
        configuration.setTransactionManagerName(persistenceUnitName);
        configuration.setTransactionInterceptor(transactionInterceptor);

        // Default bindings for EMF & Transaction Manager - they needed for repositories with @Transactional without value
        if (configuration.isDefault()) {
            context.registerAlias(entityManagerFactoryName, "entityManagerFactory");
            context.registerAlias(persistenceUnitName, "transactionManager");
        }
    }

    return context;
}