Spring Web - циркулярное руководство по включению AspectJ и управлению транзакциями - PullRequest
0 голосов
/ 26 мая 2018

Spring Web приводит к циклической ссылке при следующем условии

  1. Включить AspectJ AutoProxy & Transaction Management
  2. Создать простой бин, B1 должен загружаться первым
  3. Создайте ProxyFactoryBean, B2, который зависит от B1

Ниже приведен мой анализ.

  1. Spring пытается создать Бин B1.На этом этапе запускается AnnotationAwareAspectJAutoProxyCreator BPP.
  2. AutoProxyCreator намеревается создать TransactionAdvicer и пытается найти все компоненты типа TransactionManagementConfigurer
  3. B2, являющиеся компонентом фабрики (сбой ярлыка для проверки типа компонента фабрики)а также), весна должна создать законченный компонент B2, чтобы сравнить тип.Поскольку B2 зависит от B1, это приводит к циклической ссылке.

Один из обходных путей состоял в том, чтобы убедиться, что Spring сначала загружает фиктивный компонент, скажем, B0, от которого компонент не будет зависеть.

Конфигурация Java:

@Configuration
@DependsOn("testBean2")
@EnableTransactionManagement
public class TestConfig
{
   @Bean
   public PlatformTransactionManager transactionManager()
   {
      DriverManagerDataSource dataSource = new DriverManagerDataSource();
      // MySQL database we are using
      dataSource.setDriverClassName("com.mysql.jdbc.Driver");
      dataSource.setUrl("jdbc:mysql://localhost:3306/db");// change url
      dataSource.setUsername("username");// change userid
      dataSource.setPassword("password");// change pwd

      PlatformTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
      return transactionManager;
   }
}

Конфигурация XML:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
    <aop:aspectj-autoproxy />
    <context:component-scan base-package="test.config" />
    <bean id="testBean2" class="test.beans.TestBean2" />
    <bean id="testTransactionInterceptor"       class="org.springframework.transaction.interceptor.TransactionInterceptor">
        <property name="transactionManager" ref="transactionManager" />
        <property name="transactionAttributes">
            <props>
                <prop key="audit">PROPAGATION_REQUIRES_NEW</prop>
            </props>
        </property>
    </bean>
    <bean id="testBean1" class="org.springframework.aop.framework.ProxyFactoryBean"
        depends-on="testBean2">
        <property name="target">
            <bean class="test.beans.TestBean1" />
        </property>
        <property name="interceptorNames">
            <list>
                <value>testTransactionInterceptor</value>
            </list>
        </property>
    </bean>
</beans>

1 Ответ

0 голосов
/ 26 мая 2018

Переместите вашу декларацию @Bean в класс @Configuration.

Это предотвратит один метод bean, вызываемый дважды

...