如何在Spring配置文件中混合使用CGLIB和JDK代理?

时间:2012-04-11 17:01:26

标签: java spring aop cglib proxies

此主题与我遇到的here regarding the needs for access to protected methods of an advised class问题有关。我正在使用Spring 3.0.6,并创建了一个Spring分析方面,我正在使用JDK代理应用于大量的bean。

但是,由于需要访问一个特定bean中的受保护方法,我想使用CGLIB建议它。所有其他bean我想继续使用JDK Proxies。

我使用的是注释和xml配置的混合,但这个特定方面是在XML配置中定义的。

我知道有<aop:scoped-proxy>标签,但据我所知,这适用于所有方面。

无论如何要定义单个方面来代替使用CGLIB吗?

<aop:config>
    <aop:aspect id="Profiler" ref="lendingSimulationServiceProfilerInterceptor">
        <!-- info -->
        <aop:around method="infoProfiler"
                    pointcut="execution(* com.cws.cs.lendingsimulationservice.service.LendingSimulationServiceImpl.calculate*(..))"  />

        <!-- debug -->
        <aop:around method="infoProfiler"
                    pointcut="execution(* com.cws.cs.lendingsimulationservice.process.LendingSimulationProcessImpl.calculate(..))"  />

        <aop:around method="infoProfiler"
                    pointcut="execution(* com.blaze.BlazeEngine.invokeService(..))"  />

        <!-- trace -->
        <aop:around method="traceProfiler" 
                    pointcut="execution(* com.calculator.dao.impl.LendingSimulationDaoImpl.*(..))"  />

        <!-- NEED TO DEFINE THIS PARTICULAR ASPECT AS CGLIB -->
        <aop:around method="traceProfiler" 
                    pointcut="execution(* com.cws.cs.lendingsimulationservice.util.pool.JAXBPoolImpl.*(..))"    />
    </aop:aspect>
</aop:config>

我尝试将配置拆分为两个,并且对于一个配置指定target-class="true"和另一个target-class="false",但它似乎在那时将CGLIB应用于所有人。

有没有办法实现这个目标?

谢谢,

埃里克

1 个答案:

答案 0 :(得分:7)

不幸的是,全部或全部bean都使用CGLIB,如果您在一个地方使用目标类代理,则会强制所有其他地方使用CGLIB。引用8.6 Proxying mechanisms官方文档:

  

注意

     

多个<aop:config/>部分在运行时折叠为单个统一自动代理创建器,它应用指定的任何<aop:config/>部分(通常来自不同的XML bean定义文件)的最强代理设置。这也适用于<tx:annotation-driven/><aop:aspectj-autoproxy/>元素。

     

要明确:在'proxy-target-class="true"'<tx:annotation-driven/><aop:aspectj-autoproxy/>元素上使用<aop:config/>会强制使用CGLIB代理来支持所有这三个