2012-11-17 86 views
0

我堅持解決這個問題。Spring如何從ProxyFactoryBean中獲取具有原型範圍的bean

使用的組件:春天1.2.8,3.2.0休眠CR1,tomcat的,支柱,Java 6的

我試圖與範圍=原型來自ProxyFactryBean是獲取Bean。我不成功。我不知道什麼是錯的。

這裏是上下文:

<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);

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) 

這是工作如果ProxyFactryBean是我用ruleCheckTask代替ruleCheckTaskPrototype:

上checkTask豆試圖調用setTestCase當我得到以下異常。問題是,在那種情況下,我總是獲得ruleCheckTask的單例。我總是需要新的實例。 一件小事RuleCheckTask實現了Runnable接口。

有人能給我一個提示嗎?

謝謝

回答

1

嘗試:

<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上獲得每個請求的新實例。

+0

非常感謝。它真的很有用。我犯了錯誤,我把單身屬性目錄放入聲明中,並且我得到異常,ProxyFactoryBean必須是單例。而我的第二個錯誤是,我通過屬性「target」和「ref」而不是「targetName」和「value」來指定目標。多麼小的細節,他們很重要。獲取這些信息並不容易。你怎麼知道?你從哪裏學到這些東西?你能推薦一些關於春天的好書,電子書,鏈接嗎?謝謝 – squirrelInTheBarel

+0

春天的團隊和其他人都有很好的書,春天有很好的參考文獻。但是當你遇到這樣的問題時,最好的方法是將源代碼鏈接到庫並跳到裏面。大多數時候你會花更少的時間來找到正確的道路。例如,如果您在ProxyFactoryBean.getObject()上放置斷點,則解決方案很明確。使用源碼,盧克...(UTSL) –

相關問題