2017-06-06 123 views
0

當使用Spring Boot時,很多bean都是由Spring Boot本身隱式創建的。例如,當我鏈接spring-boot-starter-data-redis依賴項時,jedisConnectionFactory bean會自動創建。根據Spring的bean定義bean

我在尋找的是定義我的自定義bean的方式,它依賴於這樣一個隱式bean,例如, new MyService(jedisConnectionFactory)。問題是我沒有一個變量或一個將被解析爲該隱式bean的方法。

現在我已經想出了以下解決方案:創建一個單獨的BeanConfig類,自動裝配/注入ApplicationContext到它,然後檢索與ApplicationContext.getBean(Class<T>)方法調用所需的bean:

@Bean 
public Transport eventTransport() { 
    final JedisConnectionFactory jedisConnectionFactory = context.getBean(JedisConnectionFactory.class); 
    return new RedisTransport(jedisConnectionFactory.getHostName(), jedisConnectionFactory.getPort()); 
} 

是否有任何集成獲取對內部定義的bean的引用的方式?所以我可以將這個bean定義移動到MyApplication類而不注入ApplicationContext實例。

+0

只需將它們添加爲'@ Bean'方法的方法參數即可。 '公共交通事件傳輸(JedisConnectionFactory connectionFactory)'。一般來說,當你需要依賴ApplicationContext(或者BeanFactory)來檢索bean的時候,一般來說,做錯了(如果你不是一個框架/擴展開發者)。 –

+0

@ M.Deinum是的,我明白了關於使用上下文,這就是爲什麼問:)我認爲定義方法參數是正確的,所以如果你把它作爲答案發布,我會接受它。謝謝! – Scadge

回答

1

首先作爲一個經驗法則,如果你開始求助於ApplicationContextBeanFactory獲得你,一般來說豆類,這樣做是錯誤的(至少在簡單的開發與Spring的應用程序)。

在方法上使用@Bean時,可以使用0個或多個方法參數,使其成爲這些bean的工廠方法。 (這也在reference guide中解釋過)。參數根據上下文進行解析,並將注入bean(或者如果找不到,則會失敗)。

所以你的情況,你可以簡單地添加JedisConnnectionFactory(或者也許是ConnectionFactory接口)爲您的eventTransport方法的方法參數。

@Bean 
public Transport eventTransport(final JedisConnectionFactory jedisConnectionFactory) { 
    return new RedisTransport(jedisConnectionFactory.getHostName(), jedisConnectionFactory.getPort()); 
} 

這也允許Spring解決bean之間的依賴關係,而不是希望bean已經構建並完全可以使用。

+0

特別感謝文檔鏈接 - 不知何故,我沒有發現我自己 – Scadge

0

如果JedisConnectionFactory類過得去春天實例,那麼你可以簡單地autowire到此實例中的一流水平,並使用相同的創建RedisTransport對象。

@Autowired 
private JedisConnectionFactory jedisConnectionFactory; 

@Bean 
public Transport eventTransport() { 
    return new RedisTransport(jedisConnectionFactory.getHostName(), jedisConnectionFactory.getPort()); 
} 
+3

更好的是,把它作爲一個方法參數,這樣Spring可以更好地確定bean的順序。 –