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

Posted

技术标签:

【中文标题】如何在 Spring 配置文件中混合使用 CGLIB 和 JDK 代理?【英文标题】:How to mix CGLIB and JDK proxies in Spring configuration files? 【发布时间】:2012-04-11 17:01:25 【问题描述】:

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

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

我混合使用了注解和 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】:

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

注意

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

要明确:在&lt;tx:annotation-driven/&gt;&lt;aop:aspectj-autoproxy/&gt;&lt;aop:config/&gt; 元素上使用'proxy-target-class="true"' 将强制对所有三个元素使用CGLIB 代理

【讨论】:

感谢您的回复。我以前很怕那个。但后来我发现this post 似乎表明他让它工作了,但即使我用@Scope( proxyMode = ScopedProxyMode.TARGET_CLASS ) 注释我的目标类(JAXBPoolImpl),它似乎对我不起作用。

以上是关于如何在 Spring 配置文件中混合使用 CGLIB 和 JDK 代理?的主要内容,如果未能解决你的问题,请参考以下文章

Spring混合配置时,遇到配置文件路径NotFound,使用PathMatchingResourcePatternResolver解决

Java框架spring Boot学习笔记:bean管理(注解和配置文件混合使用)

Spring YAML 配置文件配置

Spring之导入和混合配置

Spring_总结_03_装配Bean之导入与混合配置

Spring5 导入和混合配置使用