2011-08-31 18 views
29

¿Es posible en Spring que la clase para bean no tenga constructor público sino solo private? ¿Se invocará este constructor privado cuando se cree bean? Gracias.Java Spring Bean con constructor privado

+6

¿Qué tal si lo intentas y luego publicas los resultados? – dm3

+0

Es difícil, no tengo todas las fuentes. – user710818

Respuesta

52

Sí, Spring puede invocar constructores privados. Si encuentra un constructor con los argumentos correctos, independientemente de la visibilidad, usará la reflexión para establecer que su constructor sea accesible.

+0

¿Podría darme la referencia a los documentos? Constructor tiene parámetros, y en el archivo xml a estos argumentos valores asignados. – user710818

+0

quieres decir si un bean tiene algo específico como bean privado() {...} spring puede invocar eso? Cómo es eso posible, que desafía el propósito de "privado". –

+0

Lo siento, probablemente estoy equivocado sobre esto solo siendo constructores no-arg. Estoy siguiendo lo que noté en mis propios proyectos. No puedo decir que lo haya visto alguna vez en la documentación de Spring. Pero este es el javadoc para la clase que es responsable de hacer la instanciación.http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/beans/BeanUtils.html#instantiateClass(java.lang.reflect.Constructor,%20java.lang.Object .. .) –

-2

Normalmente tendrá un método de fábrica estático en dichos granos, puede especificar ese método para que la primavera obtenga una instancia de ese grano. Consulte 3.3.1.3 here. Esta es la forma en que lo recomienda Spring, en lugar de ir contra las restricciones de visibilidad.

+0

extraño, no hay un método estático, no hay un constructor público pero cuando lo hago, se invoca el constructor privado. por sun.reflect.NativeConstructorAccessorImpl – user710818

+0

¡Sin detalles/código no será posible seguir comentando! –

+0

Supongo que estás equivocado. No hay un código específico: veo en el depurador solo los métodos estándar de sol/primavera. – user710818

3

Siempre se puede usar un método de fábrica para crear los granos en lugar de depender de un constructor por defecto, desde The IoC container: Instantiation using an instance factory method:

<!-- the factory bean, which contains a method called createInstance() --> 
<bean id="serviceLocator" class="com.foo.DefaultServiceLocator"> 
    <!-- inject any dependencies required by this locator bean --> 
</bean> 

<!-- the bean to be created via the factory bean --> 
<bean id="exampleBean" 
     factory-bean="serviceLocator" 
     factory-method="createInstance"/> 

Esto tiene la ventaja de que se puede utilizar constructores no predeterminados para su frijol, y el también se pueden inyectar dependencias para el método de fábrica bean.

+0

interesante, pero no puedo encontrar la fábrica. ¿Puede existir otra forma? – user710818

+0

@Matthew: Parece que está adaptando Spring en torno a un código de terceros fugitivos. Eso es solo que está desordenado. –

+1

@Donal, no, no entendí lo que dijo en el comentario. –

2

Sí, los constructores privados se invocan antes de la primavera. Considere mi código:

grano de archivo de definición:

<bean id="message" class="com.aa.testp.Message"> 
     <constructor-arg index="0" value="Hi Nice"/> 
    </bean> 

clase Bean:

package com.aa.testp; 

public class Message { 

    private String message; 

    private Message(String msg) { 
     // You may add your log or print statements to check execution or invocation 
     message = msg; 
    } 

    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     this.message = message; 
    } 

    public void display() { 
     System.out.println(" Hi " + message); 
    } 

} 

El código anterior funciona correctamente. Por lo tanto, la primavera invocó al constructor privado.

Cuestiones relacionadas