簡體   English   中英

Spring Web-關於啟用AspectJ和事務管理的通函

[英]Spring Web - Circular Reference on enabling AspectJ & Transaction Management

在以下條件下,Spring Web產生循環引用

  1. 啟用AspectJ自動代理和事務管理
  2. 創建一個簡單的bean,預期將首先加載B1
  3. 創建一個依賴於B1的ProxyFactoryBean,B2

以下是我的分析。

  1. Spring嘗試創建Bean B1。 此時,AnnotationAwareAspectJAutoProxyCreator BPP開始運行。
  2. AutoProxyCreator打算創建TransactionAdvicer並嘗試查找TransactionManagementConfigurer類型的所有bean。
  3. B2是工廠bean(檢查工廠bean類型的快捷方式也失敗了),spring需要創建完整的bean B2來比較類型。 由於B2依賴於B1,因此會產生循環參考。

一種解決方法是確保Spring首先加載一個虛假的bean,即B0,沒有bean依賴。

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>

將您的@Bean聲明移到@Configuration類。

它將防止一個調用兩次的bean方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM