7

Estoy tratando de usar Spring Framework IoC Container para crear una instancia de la clase ThreadPoolExecutor.CallerRunsPolicy. En Java, lo haría de esta manera ...Cómo crear un Spring Bean a partir de un constructor de clase interna estática?

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

Pero cuando trato de hacer el equivalente en la primavera, que arroja un CannotLoadBeanClassException.

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

De manera más general: en un XML de Spring Application Context, ¿cómo se puede llamar a un constructor de una clase interna estática?

Respuesta

13

creo que la razón por la que no funciona es porque la primavera no es capaz de entenderlo como una clase interna estática. Probablemente esto se puede trabajar:

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

volver a leer la pregunta original y la muestra del código. Me doy cuenta de que drew no está intentando invocar un método estático; solo el constructor de una clase anidada. La sintaxis '$' es correcta para usar aquí, he usado esto antes. –

+0

Eso funcionó, gracias Ankit. Los documentos de Spring están aquí: http://static.springsource.org/spring/docs/2.0.x/reference/beans.html#beans-factory-class y dice "para configurar una definición de bean para una clase interna estática, tienes que usar el nombre binario de la clase interna ". – Drew

1

Uso the factory-method attribute:

La siguiente definición de frijol especifica que el grano se crea llamando a una fábrica de método. La definición no especifica el tipo (clase) del objeto devuelto, solo la clase que contiene el método de fábrica. En este ejemplo, el método createInstance() debe ser un método estático.

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

hice intentar algunas variaciones de "fábrica-método", pero eso no quiere trabajar aquí porque ThreadPoolExecutor.CallerRunsPolicy es un constructor de edad regular de Java. Esta es una clase estática. – Drew

+0

El hecho de que CRP sea una clase anidada estática no debería importar aquí. Si bien el ejemplo de matt b para un método estático es correcto, en realidad no necesita invocar un método estático aquí ... simplemente un simple constructor. Dicho esto, me gustaría ver el resto de los detalles de CannotLoadBeanClassException. – RonU

Cuestiones relacionadas