我想更好地瞭解了@Autowired註解組件掃描的,但我迄今發現在某些時候使用context.getBean(..)的例子讓至少一個Bean開始。春天沒有的getBean(..)
我也看了,這樣做被認爲是不好的做法,但我似乎無法找到如何做沒有context.getBean(..)的任何信息
可能有人請賜教用一個例子和如何做到這一點的信息?
我想更好地瞭解了@Autowired註解組件掃描的,但我迄今發現在某些時候使用context.getBean(..)的例子讓至少一個Bean開始。春天沒有的getBean(..)
我也看了,這樣做被認爲是不好的做法,但我似乎無法找到如何做沒有context.getBean(..)的任何信息
可能有人請賜教用一個例子和如何做到這一點的信息?
不時(通常不使用Spring啓動的時候),我使用沿着下面的代碼線的東西:
public static <T> T autowire(ApplicationContext ctx, T bean) {
ctx.getAutowireCapableBeanFactory().autowireBean(bean);
return bean;
}
在我main
,我創建了一個包含主要的應用程序類的一個實例我的Spring應用程序的主要服務/入口點的一些@Autowired註釋。
在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;
它是如何工作
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應用程序,那麼你應該看到DispatcherServlet
與ContextLoaderListener
類。這些類將啓動您的應用程序並根據配置加載所有內容。 f.ex. here, 但如果你想創建一個桌面應用程序,那麼你最終會像this
問題,要求我們建議還是找一本書,工具,軟件庫,教程或其他異地資源是摘堆棧溢出的主題 – Marcinek