7

J'essaie d'utiliser le Spring Framework IoC Container pour créer une instance de classe ThreadPoolExecutor.CallerRunsPolicy. En Java, je le ferais de cette façon ...Comment créer un bean Spring à partir d'un constructeur de classe interne statique?

import java.util.concurrent.RejectedExecutionHandler; 
import java.util.concurrent.ThreadPoolExecutor; 
... 
RejectedExecutionHandler rejectedExecutionHandler = new ThreadPoolExecutor.CallerRunsPolicy(); 

Mais lorsque je tente de faire l'équivalent au printemps, il jette un CannotLoadBeanClassException.

<beans> 
    <bean class="java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy"/> 
</beans> 

Plus généralement: dans un XML Spring ApplicationContext, comment pouvez-vous appeler un constructeur d'une classe interne statique?

Répondre

13

Je pense que la raison pour laquelle il ne fonctionne pas parce que le printemps est pas en mesure de le comprendre comme une classe interne statique. Probablement cela peut fonctionner:

<beans> 
    <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy"/> 
</beans> 
+1

relecture de la question d'origine et de l'exemple de code Je réalise que dessiné n'essaie pas d'invoquer une méthode statique du tout; juste le constructeur d'une classe imbriquée. La syntaxe '$' est correcte à utiliser ici, je l'ai déjà utilisée auparavant. –

+0

Ça a marché, merci Ankit. Les documents de Spring sont ici: http://static.springsource.org/spring/docs/2.0.x/reference/beans.html#beans-factory-class et il est dit "pour configurer une définition de bean pour une classe interne statique, vous devez utiliser le nom binaire de la classe interne. " – Drew

1

Utilisation the factory-method attribute:

La définition de haricot suivant spécifie que le haricot sera créé en appelant une méthode de fabrication. La définition ne spécifie pas le type (classe) de l'objet retourné, seule la classe contenant la méthode factory. Dans cet exemple, la méthode createInstance() doit être une méthode statique.

<bean id="clientService" class="examples.ClientService" 
    factory-method="createInstance"/> 
+0

Je l'ai fait essayer quelques variations de « méthode de l'usine », mais cela ne fonctionne pas ici parce que ThreadPoolExecutor.CallerRunsPolicy est un constructeur régulier vieux Java. C'est une classe statique. – Drew

+0

Le fait que CRP soit une classe imbriquée statique ne devrait pas importer ici. Bien que l'exemple de matt b pour une méthode statique soit correct, vous n'avez pas besoin d'invoquer une méthode statique ici ... juste un simple constructeur. Cela étant dit, je serais curieux de voir le reste des détails de l'exception CannotLoadBeanClassException. – RonU