gpt4 book ai didi

java - Spring 如何从 ProxyFactoryBean 获取具有原型(prototype)范围的 bean

转载 作者:行者123 更新时间:2023-12-01 15:02:35 25 4
gpt4 key购买 nike

我一直被这个问题困扰。

使用的组件:Spring 1.2.8、Hibernate 3.2.0 cr1、tomcat、struts、java 6

我正在尝试从 ProxyFactoryBean 获取 bean,其范围 = 原型(prototype)。我没有成功。我不知道出了什么问题。

这是上下文:

<beans>

<bean id="ruleCheckTask" class="rulechecker.RuleCheckTask" singleton="false">

<bean id="ruleCheckTaskPrototype" class="org.springframework.aop.target.PrototypeTargetSource">
<property name="targetBeanName" value="ruleCheckTask" />
</bean>

<bean id="transactionInterceptorRuleCheckTask" class="org.springframework.transaction.interceptor .TransactionInterceptor">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributeSource">
<value>
rulechecker.IRuleCheckTask.run=PROPAGATION_REQUIRE S_NEW
</value>
</property>
</bean>

<bean id="ruleCheckTaskService" class="org.springframework.aop.framework.ProxyFact oryBean">
<property name="target" ref="ruleCheckTaskPrototype" />
<property name="proxyInterfaces">
<value>
rulechecker.IRuleCheckTask
</value>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptorRuleCheckTask</value>
</list>
</property>
</bean>
</beans>

在代码中,当我执行以下操作时:

......................

......................

IRuleCheckTask checkTask = (IRuleCheckTask) applicationContext.getBean("ruleCheckTaskService") ;checkTask.setTestCase(oneTestCase);

尝试在 checkTask bean 上调用 setTestCase 时出现以下异常:

java.lang.IllegalArgumentException: object is not an instance of declaring class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Nativ e Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknow n Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Un known Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.aop.support.AopUtils.invokeJoi npointUsingReflection(AopUtils.java:287)
at org.springframework.aop.framework.ReflectiveMethod Invocation.invokeJoinpoint(ReflectiveMethodInvocat ion.java:181)
at org.springframework.aop.framework.ReflectiveMethod Invocation.proceed(ReflectiveMethodInvocation.java :148)
at org.springframework.transaction.interceptor.Transa ctionInterceptor.invoke(TransactionInterceptor.jav a:96)
at org.springframework.aop.framework.ReflectiveMethod Invocation.proceed(ReflectiveMethodInvocation.java :170)
at org.springframework.aop.framework.JdkDynamicAopPro xy.invoke(JdkDynamicAopProxy.java:176)
at $Proxy21.setTestCase(Unknown Source)

如果在ProxyFactoryBean中我使用ruleCheckTask而不是ruleCheckTaskPrototype,它就可以工作。问题是在这种情况下我总是获得ruleCheckTask的单例。我总是需要新的实例。一件小事 RuleCheckTask 实现了 Runnable 接口(interface)。

有人可以给我提示吗?

谢谢

最佳答案

尝试:

<bean id="ruleCheckTaskService" class="org.springframework.aop.framework.ProxyFact oryBean">
<property name="targetName" value="ruleCheckTask" />
<property name="singleton" value="false" /> <!-- this do the trick -->
<property name="proxyInterfaces">
<value>
rulechecker.IRuleCheckTask
</value>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptorRuleCheckTask</value>
</list>
</property>
</bean>

您还可以将 targetSource(无 target)设置为 ruleCheckTaskPrototype。不同之处在于,在第一个上,您有一个独立的代理配置实例,在第二个上,PrototypeTargetSource 在每个请求上获取一个新实例。

关于java - Spring 如何从 ProxyFactoryBean 获取具有原型(prototype)范围的 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13434799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com