2012-03-07 12 views
15

Se sto scrivendo un metodo factory static per creare oggetti, come faccio ad usare l'annotazione '@Component' per quella classe factory e indicare (con alcune annotazioni) il metodo statico di fabbrica che dovrebbe essere chiamato per creare i fagioli di quella classe? Di seguito è riportato il pseudo-codice di ciò che intendo:Spring 3 @Componente e metodo factory statico

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

risposta

16

temo che non si può fare questo al momento. Tuttavia è abbastanza semplice con la configurazione di Java:

@Configuration 
public class Conf { 

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

} 

In questo caso MyStaticFactory non richiede alcuna annotazioni di primavera. E ovviamente puoi usare il buon vecchio XML.

6

È necessario utilizzare l'interfaccia a molla FactoryBean.

Interfaccia da implementata dagli oggetti utilizzati entro un BeanFactory che sono essi stessi fabbriche. Se un bean implementa questa interfaccia, è utilizzato come factory per un oggetto da esporre, non direttamente come istanza di bean che verrà esposta.

Implementare l'interfaccia e dichiarare un bean per esso. Per esempio:

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

Attraverso @Component e la scansione dei componenti, questa classe verrà scoperto. Spring rileverà che è un FactoryBean ed espone l'oggetto restituito da getObject come bean (singleton se lo si specifica).

In alternativa, è possibile fornire una dichiarazione @Bean o <bean> per questa classe 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; 
    } 

} 

Usa:

@Component 
public class SomeClass{ 


    @Autowired 
    MyObject myObject; 
} 
+0

scovare commentare un codice nella tua risposta? – mlkn