2014-11-04 57 views
2

我是DI的Spring,並且使用XML的不是從@Configuration類中的一種方法創建多個beans

基於配置(例如,一個XML /屬性文件),我正在尋找創建一個特定類型的bean的數量(確切的數字是由配置確定的)放在我的上下文,以便他們可以自動裝配進入課堂。

由我會自動裝配:@Autowired public MyClass(List<MyType> types)

我期待在使用帶有@Configuration註解的類。

所以我可以做這樣的事情:

@Configuration 
public MyConfigurationClass { 

    @Autowired 
    public void configure(ApplicationContext context) { 
     // register stuff here 
    } 
} 

...但它不「感覺」吧...

什麼是「春」的方式來實現這一目標?

編輯:

想象一下代碼,其中ToTy都只是空的類定義。

@Configuration 
public class Config { 

    @Bean 
    public Collection<Ty> tyList() { 
     return new ArrayList<Ty>() {{ 
      this.add(new Ty()); // could be any number of Ty instances. 
     }}; 
    } 

    @Bean 
    public To to(Collection<Ty> tylist) { 
     return new To(); 
    } 
} 
+2

到底什麼意思是「獲取可變數量的類實例到spring的上下文中」? – Dodge 2014-11-04 15:12:50

+0

@Dodge - 我的編輯對你更有意義嗎? – Cheetah 2014-11-04 15:16:44

+2

爲什麼不創建多個'@ Bean'方法? – 2014-11-04 15:25:47

回答

0

我不知道如果我理解正確的你,但我相信是你想要的。

public interface MyStuff { 
    void doSomething(); 
} 

@Scope("prototype") // 1 
@Service("stuffA") // 2 
public class MyStuffImpl_A implements MyStuff { 
    public void doSomething() 
    { 
    // do your stuff 
    } 
} 

@Scope("prototype") 
@Service("stuffB") 
public class MyStuffImpl_B implements MyStuff { 
    public void doSomething() 
    { 
    // do your stuff the B way ;) 
    } 
} 

現在你可以這樣做:

public class UseTheStuff { 

    @Autowired 
    private Provider<MyStuff> stuffA; // 3 

    @Autowired 
    private Provider<MyStuff> stuffB; // 4 

    public void doStuffWithTheProvider(){ 
    MyStuff stuffA.get(); // 5 
    MyStuff stuffB.get(); // 6 
    } 
} 
  1. 告訴Spring使用此實現爲原型
  2. 名這個implementatnion的MyStuff的: 「stuffA」
  3. 獲得提供商(名「stuffA」告訴spring注入一個MyStuffImpl_A提供者)
  4. 得到一個Provider(名字「stuffB」告訴spring要注入TA MyStuffImpl_B提供商)
  5. 使用提供程序創建MyStuffImpl_A
  6. 的實例使用提供創建MyStuffImpl_B
+0

我認爲,它看起來不是OP所要求的。他希望通過指定創建應用程序上下文實例化後應該創建多少個bean的編號來創建bean。此外,他希望使用@Configuration註釋,這表示Spring必須將標記的類保留爲beans藍色類(類似於xml文件) – energizer 2014-11-04 16:15:43

+0

@energizer成爲可能。如前所述,我不確定他是否想要這樣做。至少這是一個嘗試幫助:-) – Dodge 2014-11-05 07:12:11

0

的實例,如果您並不需要有單獨的預選賽和自動裝配可以爲你列出可以在Spring 4要這樣做:

@Configuration 
public MyConfigurationClass { 

    @Bean 
    public List<MyType> configure() { 
     //create your dynamical list here 
    } 
} 

但對於春季3(其中仿製藥被忽略),你會使用更安全:

@Configuration 
public MyConfigurationClass { 

    @Bean 
    @Qualifier("mylist") 
    public List<MyType> configure() { 
     //create your dynamical list here 
    } 
} 

和自動裝配:

@Autowired public MyClass(@Qualifier("mylist") List<MyType> types) 

有了這個,你就不需要直接接觸的ApplicationContext實例。這不被認爲是非常好的做法。

編輯:

你試過嗎?:

@Configuration 
public class Config { 

    @Bean 
    @Qualifier("tylist") 
    public Collection<Ty> tyList() { 
     return new ArrayList<Ty>() {{ 
      this.add(new Ty()); // could be any number of Ty instances. 
     }}; 
    } 

    @Bean 
    public To to(@Qualifier("tylist") Collection<Ty> tylist) { 
     return new To(); 
    } 
} 
+0

嗯,我發誓我試過你的第一個例子 - 讓我再試一次。 – Cheetah 2014-11-04 19:38:40

+0

我正在使用Spring 4.1.1廣告,您的第一個示例不起作用。 – Cheetah 2014-11-07 13:51:25

+0

你可以用這個自動裝配貼吧:「我會autowire通過:@Autowired公共MyClass(列表類型)」 – luboskrnac 2014-11-07 13:54:41

相關問題