Spring Web - циркулярный справочник по включению AspectJ и управлению транзакциями

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

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

Ниже мой анализ.

  1. Весна пытается создать Боб B1. В этот момент запускается AnnotationAwareAspectJAutoProxyCreator BPP.
  2. AutoProxyCreator намеревается создать TransactionAdvicer и пытается найти все компоненты типа TransactionManagementConfigurer
  3. B2, являющийся фабричным компонентом (ярлык для проверки типа фабричного компонента также не удался), Spring должен создать завершенный компонент 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 ответ

Переместить ваш @Bean декларация к @Configuration учебный класс.

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

Другие вопросы по тегам