2014-09-10 141 views
13
@Configuration 
public class MyConfig { 
    @Bean(name = "myObj") 
    public MyObj getMyObj() { 
     return new MyObj(); 
    } 
} 

我有@Configuration Spring批註的此MyConfig對象。 我的問題是,我怎樣才能以編程方式檢索bean(在普通類中)?例如,以編程方式檢索Bean

代碼片段看起來像這樣。 在此先感謝。

public class Foo { 
    public Foo(){ 
    // get MyObj bean here 
    } 
} 

public class Var { 
    public void varMethod(){ 
      Foo foo = new Foo(); 
    } 
} 
+0

嘗試'@ Autowire'ing ...或更準確地說'@Qualifier(「myObj」)'。 – 2014-09-10 22:10:30

+0

我不能這樣做@Autowire,因爲我必須在運行時使用new創建Foo對象 – user800799 2014-09-10 22:11:29

+0

查看[Qualifier註釋](http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference /html/beans.html#beans-autowired-annotation-qualifiers)。 – 2014-09-10 22:12:27

回答

6

這裏爲例

public class MyFancyBean implements ApplicationContextAware { 

    private ApplicationContext applicationContext; 

    void setApplicationContext(ApplicationContext applicationContext) { 
    this.applicationContext = applicationContext; 
    } 

    public void businessMethod() { 
    //use applicationContext somehow 
    } 

} 

但是你很少需要直接訪問的ApplicationContext。通常你會啓動一次,讓bean自動填充。

在這裏你去:

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); 

注意,你沒有提到已經包含在applicationContext.xml中的文件。現在,你可以簡單地通過名稱或類型取一個綠豆:

ctx.getBean("someName") 

注意,有噸的方法來啓動春 - 使用的ContextLoaderListener,@Configuration類等

2

最簡單的(雖然不是最乾淨的)方法,如果你真的需要從ApplicationContext是讓你的類實現ApplicationContextAware接口,並提供了setApplicationContext()方法來獲取豆。

一旦您參考了ApplicationContext,就可以訪問許多將向您返回bean實例的方法。

不足之處在於,這會讓您的類意識到Spring上下文,除非必要,否則應避免這種情況。

5

試試這個:

public class Foo { 
    public Foo(ApplicationContext context){ 
     context.getBean("myObj") 
    } 
} 

public class Var { 
    @Autowired 
    ApplicationContext context; 
    public void varMethod(){ 
      Foo foo = new Foo(context); 
    } 
} 
+1

@Xstian我也通過'ApplicationContext'去。 ; D – 2014-09-11 14:44:56

+0

你說得對,是類似的解決方案:D – Xstian 2014-09-11 15:03:11