2011-09-29 103 views
0

我有一個工廠,創建實例:正確的方法來從的applicationContext春得豆

public class myFactory { 
    public static getInstace() { 
     switch(someInt) { 
      case 1: 
       return new MySpringBean(); 
      case 2: 
       return new MyOtherSpringBean(); 
     } 
    } 
} 

我需要返回由春「管理」 BC他們有交易的業務邏輯方法豆子的新實例。我在這裏讀過很多文章,我不應該使用getBean方法從applicationContext獲取單例或新實例。但我找不到適合我的案例的正確方法。我已經使用@Resource,它似乎工作,但它不支持靜態字段。 Thanx

回答

2

有許多方法可以在春季實現這一點,給出的工廠類最明顯的方法是使用JavaConfig。如果您使用的彈簧使JavaConfig註解,你可以做到以下幾點來構建你的豆子,並將其添加到應用程序上下文:

@Configuration 
public class myFactory { 
    @Bean 
    public static getInstance() { 
     switch(someInt) { 
      case 1: 
       return new MySpringBean(); 
      case 2: 
       return new MyOtherSpringBean(); 
     } 
    } 
} 
0

一種方法是創建一個工廠類和保存(每執行一個豆的情況下,通用接口MyBean)作爲在某些鍵值在地圖(beans):

public class MyBeanFactory { 

    private Map<Integer, MyBean> beans; 

    public MyBean create(Integer which) { 
     if (which != null) 
      return beans.get(which); 
     else 
      throw new IllegalArgumentException("Unknown bean"); 
    } 

    public void setBeans(Map<Integer, MyBean> beans) { 
     this.beans = beans; 
    } 
} 

在Spring applicationContext.xml現在創建一個豆腐工廠,並設置豆類:

<beans...> 
    <bean id="myBeanFactory" class="foo.bar.MyBeanFactory"> 
     <property name="beans"> 
      <map> 
       <entry key="1"> 
        <bean class="foo.bar.MyBeanA" /> 
       </entry> 
       <entry key="2"> 
        <bean class="foo.bar.MyBeanB" /> 
       </entry> 
      </map> 
     </property> 
    </bean> 
</beans> 

最後,你可以像往常一樣注入bean工廠,並從例如像這樣的:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "classpath:/applicationContext.xml" }) 
public class MyBeanFactoryTest { 

    @Autowired 
    private MyBeanFactory myBeanFactory; 

    @Test 
    public void test() { 
     Assert.assertTrue(myBeanFactory.create(1) instanceof MyBeanA); 
     Assert.assertTrue(myBeanFactory.create(2) instanceof MyBeanB); 
    } 

} 
0

您實現org.springframework.beans.factory.FactoryBean接口本身是工廠對象。

FactoryBean接口是可插入到Spring IoC容器實例化邏輯中的一個點。如果你有複雜的初始化代碼,用Java可以更好地表達,而不是(可能)冗長的XML,你可以創建自己的FactoryBean,在該類中寫入複雜的初始化,然後將自定義的FactoryBean插入到容器中。

FactoryBean接口提供了三種方法:

  • Object getObject():返回該工廠創建的對象的實例。這個實例可能是共享的,這取決於這個工廠是否返回單例或原型。

  • boolean isSingleton():如果此FactoryBean返回單身,則返回true,否則返回false。

  • Class getObjectType():返回由getObject()方法或空返回的對象類型,如果該類型不是預先

已知看一看Spring Docs