2012-03-07 17 views
15

Si estoy escribiendo un método de fábrica estático para crear objetos, ¿cómo puedo utilizar la anotación '@Component' para esa clase de fábrica e indicar (con alguna anotación) el método de fábrica estático que debería llamarse para crear frijoles de esa clase? El siguiente es el pseudo-código de lo que quiero decir:Spring 3 @Component y static factory method

@Component 
class MyStaticFactory 
{ 
    @<some-annotation> 
    public static MyObject getObject() 
    { 
     // code to create/return the instance 
    } 
} 

Respuesta

16

Me temo que no se puede hacer esto actualmente. Sin embargo, es bastante simple con configuración de Java:

@Configuration 
public class Conf { 

    @Bean 
    public MyObject myObject() { 
     return MyStaticFactory.getObject() 
    } 

} 

En este caso MyStaticFactory no requiere ningún anotaciones de primavera. Y, por supuesto, puedes usar el buen viejo XML en su lugar.

6

Debe utilizar la interfaz de resorte FactoryBean.

Interface para ser implementado por objetos que se utilizan dentro de un BeanFactory que son en sí mismas fábricas. Si un bean implementa esta interfaz, es que se usa como fábrica para que un objeto se exponga, no directamente como una instancia de bean que se expondrá a sí misma.

Implemente la interfaz y declare un bean para ella. Por ejemplo:

@Component 
class MyStaticFactoryFactoryBean implements FactoryBean<MyStaticFactory> 
{ 
    public MyStaticFactory getObject() 
     MyStaticFactory.getObject(); 
    } 
    public Class<?> getObjectType() { 
     return MyStaticFactory.class; 
    } 
    public boolean isSingleton() { 
     return true; 
    } 
} 

A través de la exploración y @Component componente, se descubrió esta clase. Spring detectará que es FactoryBean y expondrá el objeto que devuelve desde getObject como un bean (singleton si lo especifica).

O bien, puede proporcionar una declaración @Bean o <bean> para esta clase FactoryBean.

-1

Bean:

public class MyObject { 

     private String a; 

     public MyObject(String a) { 
      this.a = a; 
     } 

     @Override 
     public String toString() { 
      return a; 
     } 
    } 

FactoryBean:

@Component 
public class MyStaticFactory implements FactoryBean<MyObject> { 


    @Override 
    public MyObject getObject() throws Exception { 
     return new MyObject("StaticFactory"); 
    } 

    @Override 
    public Class<?> getObjectType() { 
     return MyObject.class; 
    } 

    @Override 
    public boolean isSingleton() { 
     return true; 
    } 

} 

Uso:

@Component 
public class SomeClass{ 


    @Autowired 
    MyObject myObject; 
} 
+0

desvivían que comentar un código en su respuesta? – mlkn

Cuestiones relacionadas