2012-03-07 97 views
15

如果我正在編寫一個靜態工廠方法來創建對象,那麼如何對該工廠類使用'@Component'註釋並指示(帶有一些註釋)靜態工廠方法應該被調用來創建該類的bean?以下是我的意思的僞代碼:Spring 3 @Component和靜態工廠方法

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

回答

16

恐怕你目前無法做到這一點。然而,它是與Java配置很簡單:

@Configuration 
public class Conf { 

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

} 

在這種情況下MyStaticFactory不需要任何Spring註解。當然,你可以使用好的XML來代替。

6

您需要使用彈簧接口FactoryBean

接口將由BeanFactory內使用的對象實現,其中 本身是工廠。如果一個bean實現了這個接口,那麼這個接口就是 作爲一個對象公開的工廠,而不是直接作爲一個將會暴露的bean的實例 。

實現該接口併爲其聲明一個bean。例如:

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

通過@Component和組件掃描,這個類將被發現。 Spring會檢測到它是一個FactoryBean,並將你從getObject返回的對象作爲一個bean(如果你指定它爲單例)。

或者,您可以爲此FactoryBean類提供@Bean<bean>聲明。

-1

豆:

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; 
    } 

} 

用途:

@Component 
public class SomeClass{ 


    @Autowired 
    MyObject myObject; 
} 
+0

Coudl你在你的答案註釋代碼? – mlkn 2016-10-19 14:17:57