如何在Spring配置文件混合CGLIB和JDK代理?(How to mix CGLIB and J

2019-07-28 22:09发布

此线程相关的,我遇到一个问题, 这里就需要访问一个被通知对象的保护方法 。 我使用Spring 3.0.6,并创造了我申请使用JDK代理豆显著数量春分析方面。

然而,由于需要访问一个特定的bean受保护的方法,我想用CGLIB提供建议。 所有其他豆类我想继续使用JDK代理。

我使用的注释和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在这一点适用于所有。

有没有办法做到这一点?

谢谢,

埃里克

Answer 1:

不幸的是,无论是全或无豆使用CGLIB,如果你在一个地方使用的对象类的代理,它被强制在所有其他地方。 引用8.6代理机制正式文件:

注意

多个<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代理为他们三个



文章来源: How to mix CGLIB and JDK proxies in Spring configuration files?