2016-02-05 73 views
2

我想更好地瞭解了@Autowired註解組件掃描的,但我迄今發現在某些時候使用context.getBean(..)的例子讓至少一個Bean開始。春天沒有的getBean(..)

我也看了,這樣做被認爲是不好的做法,但我似乎無法找到如何做沒有context.getBean(..)的任何信息

可能有人請賜教用一個例子和如何做到這一點的信息?

+1

問題,要求我們建議還是找一本書,工具,軟件庫,教程或其他異地資源是摘堆棧溢出的主題 – Marcinek

回答

-1

不時(通常不使用Spring啓動的時候),我使用沿着下面的代碼線的東西:

public static <T> T autowire(ApplicationContext ctx, T bean) { 
    ctx.getAutowireCapableBeanFactory().autowireBean(bean); 
    return bean; 
} 

在我main,我創建了一個包含主要的應用程序類的一個實例我的Spring應用程序的主要服務/入口點的一些@Autowired註釋。

1

在XML定義你的bean,並使用

<context:component-scan base-package="com" /> 
<mvc:annotation-driven /> 

豆高清

<bean id="processEngine" class="com.processEngine"> 
<property name="processEngineConfiguration" ref="processEngineConfiguration" /> 
</bean> 

現在你可以得到豆如下

@Autowired 
private ProcessEngine processEngine; 
0

它是如何工作

spring會從xml或java配置中掃描bean的配方。然後彈簧創建一個beanDefinitions,它們被「加載」到BeanFactory中。 BeanFactory觸發一組BeanPostProcessors(BPP),其掃描類特定的註釋等Autowired/Resource/PostProcessor等,並做適當的行動。在當你的類包含@Autowired註釋,情況AutowiredAnnotationBeanPostProcessor會自動線必填字段(依賴),並且當一個對象的創建完成後,所有BPP制定出來的,目的是準備由應用程序使用,從這點你的代碼可以得到來自容器的'ready'對象。

有一些情況下,當你需要從它出來春天的控制,而不是由容器管理的代碼訪問此豆。爲此,您需要獲取ApplicationContext(容器),並且請致電#getBean指定名稱或類型。直接使用applicationContext並不是一種好的做法,因爲有些問題你可以來,f.ex.一個bean的id可能會被改變,如果你通過id引用bean,那麼將引發NPE

配置

有配置Spring掃描類尋找豆菜譜幾種方法。一個將被定義component-scan,在您設定分別位於路徑這種情況下類和具有類似於@Component任何有效的春天註釋,@Service@Repository@Controller(用於Web容器)將被考慮。另一種方法是分別使用<bean>@Bean來指定每個bean。

例子。 如果你想創建一個web應用程序,那麼你應該看到DispatcherServletContextLoaderListener類。這些類將啓動您的應用程序並根據配置加載所有內容。 f.ex. here, 但如果你想創建一個桌面應用程序,那麼你最終會像this