spring ProxyFactoryBean什么时候需要配置proxyTargetClass
比如现在有这样一段代码:
<bean id="ttransactionDefinition" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributeSource">
<ref bean="txAttributeSource" />
</property>
</bean>
<bean id="test" parent="ttransactionDefinition">
<property name="proxyTargetClass" value="true"></property>
<property name="target">
<bean class="com.alibaba.intl.biz.escrow.message.TestTram" />
</property>
</bean>
<bean id ="testProxyCls" class="com.wolf.TestProxyClass">
<property name="test" bean="test"/>
</bean>
proxyTargetClass需要配置的情况只有一种:
当TestTram类有实现某个接口,而TestProxyClass类中配置的类对象是TestTram时(而不是TestTram实现的接口),这时候你需要配置proxyTargetClass=true
如果TestTram没有实现某个接口,而TestProxyClass类中配置的类对象是TestTram,这个时候我们是不需要配置proxyTargetClass=true的.(使用cgilib来动态代理)
如果TestTram实现某个接口, 而TestProxyClass类中配置的是TestTram实现的interface的话.那样我既不需要配置proxyInterface,也不需要配置proxyTargetClass
为什么我们在没有配置proxyInterface情况下,去配置proxyTargetClass.因为spring会去拿到当前配置的target实现的所有接口,然后通过动态代理出类.
可以看看spring的这段代码:(AbstractSingletonProxyFactoryBean类)
if (this.proxyInterfaces != null) {
proxyFactory.setInterfaces(this.proxyInterfaces);
}
else if (!isProxyTargetClass()) {
// Rely on AOP infrastructure to tell us what interfaces to proxy.
proxyFactory.setInterfaces(ClassUtils.getAllInterfacesForClass(targetSource.getTargetClass()));
}
this.proxy = getProxy(proxyFactory);
分享到:
相关推荐
如果没有接口,或者配置了`proxyTargetClass=true`,则会使用CGLIB代理,它通过字节码生成技术实现。 2. **配置属性**: - `target`:这是必须设置的属性,表示要代理的目标对象。 - `interceptors`或`advisors`...
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean"> <value>com.sxt.spring.model.IUser</value> <value>afterAdvice <value>logAdvice <value>aroundAdvice ...
3. proxyTargetClass:是否对类代理而不是接口,设置为 true 时,使用 CGLIB 代理。 4. interceptorNames:需要植入目标的 Advices。 5. singleton:返回的代理是否为单例,默认为 true(返回单实例)。 6. optimize...
- **强制使用 CGLib 代理**:通过设置 `proxyTargetClass` 属性为 `true` 可以强制使用 CGLib 代理。 - **接口指定**:如果目标类实现了多个接口,则可以通过设置 `proxyInterfaces` 属性来指定创建的代理类型。 ##...
在这个例子中,`Target`是我们要代理的类,它需要实现一个接口,以便JDK Proxy能够创建它的代理。`ProxyFactory`负责生成代理对象,我们可以通过配置`addAdvice`来添加拦截器,定义代理对象在调用方法前后的行为。 ...
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target"> <ref bean="target bean"/> <list><value>interfaces of target bean implemented</value></list...
1. `ProxyFactoryBean`:通过设置`target`属性指定目标对象,然后调用`createProxy()`方法生成代理对象。 2. `ProxyFactory`:与`ProxyFactoryBean`类似,但更底层,提供了更多的自定义选项。 3. `...
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean"> <value>advisor</value> <!-- 引用顾问 --> <property name="target" ref="targetObject"></property> <!-- 目标对象 -->...
<bean id="proxyFactory" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="targetObject"/> <value>beforeAdvice <value>afterReturningAdvice ``` 2. ...
<bean id="studentDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="studentDao"/> <value>myAspect ``` 在这个例子中,`myAspect`是一个切面,`...
在Spring Dynamic Proxy模块中,`org.springframework.aop.framework.ProxyFactoryBean`和`org.springframework.aop.framework.ProxyFactory`是创建代理对象的主要工具。它们可以根据配置的拦截器链来创建代理,并且...
在深入了解Spring AOP之前,我们需要了解几个基本的概念: 1. **切面(Aspect)**:封装了横切关注点的模块。在Spring AOP中,切面可以由类或者方法来实现。 2. **连接点(JointPoint)**:程序执行过程中的某个特定点...
在具体的实现上,Spring提供了一个ProxyFactoryBean工厂类,开发者可以通过配置这个工厂Bean来生成代理对象。开发者需要指定目标对象以及要应用的拦截器(advisors)。拦截器可以是简单的拦截器,也可以是复杂的切面...
- `org.springframework.aop.framework.ProxyFactoryBean` 或 `org.springframework.aop.aspectj.autoproxy.AspectJProxyFactory`:创建代理对象。 - `org.springframework.aop.MethodBeforeAdvice`,`org.spring...