此主题与我遇到的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应用于所有人。
有没有办法实现这个目标?
谢谢,
埃里克
答案 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代理来支持所有这三个