[英]Spring Dependency Injection via @Configuration, @Bean and @Component
[英]Spring configuration for dependency injection
我正在通過Struts2學習spring依賴注入,這是在一個Web項目上進行的。 在我的示例中,我創建了一個有動物的動物園 。 如果注射成功,動物會說話。 例如在控制台中,我們將看到狗的談話:
Wowowo ฅ^•ﻌ•^ฅ
但是,如果注入失敗,那么我們將看到:
zooService bean has not been injected.
這是我的應用程序的體系結構:
com.zoo.controller.ZooController
是用於接收Web操作的控制器。 com.zoo.service.ZooService
是動物對話的界面 com.zoo.service.ZooServiceForDog
是狗說話的實現 到步驟為止,一切正常。 Spring通過使用名為applicationContext.xml
的XML文件處理依賴項注入。 但是,我對此文件有2種配置類型,第一種Config 1有效,而第二種Config 2無效。
使用配置1 注入成功 。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="zooService" class="com.zoo.service.ZooServiceForDog" />
</beans>
使用配置2 注入失敗 。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="zooController" class="com.zoo.controller.ZooController">
<property name="zooService" ref="zooServiceBean" />
</bean>
<bean id="zooServiceBean" class="com.zoo.service.ZooServiceForDog" />
</beans>
有人可以解釋為什么Config 2無法正常工作嗎?
這是其他可能有助於解決此問題的代碼:
com.zoo.controller.ZooController
類:
package com.zoo.controller;
import com.zoo.service.ZooService;
import com.opensymphony.xwork2.ActionSupport;
public class ZooController extends ActionSupport {
private static final long serialVersionUID = 1L;
private ZooService zooService;
public String live () {
if (zooService != null) {
zooService.talk();
} else {
System.out.println("zooService bean has not been injected.");
}
return SUCCESS;
}
public ZooService getZooService() {
return zooService;
}
public void setZooService(ZooService zooService) {
this.zooService = zooService;
}
}
它不能工作,因為zooController
的范圍是單例。 您應該使范圍prototype
。
<bean id="zooController" class="com.zoo.controller.ZooController" scope="prototype" >
<property name="zooService" ref="zooServiceBean" />
</bean>
依賴項管理由容器定義:
如果您的操作由Struts容器管理,則Struts會在
default
范圍內創建它們。 如果您的操作是由Spring容器管理的,那么您需要定義操作bean的范圍,因為默認情況下,Spring使用singleton
范圍,並且如果您不想在用戶請求之間共享操作bean,則應該定義相應的范圍。 您可以使用prototype
作用域,這意味着每次構建Struts動作實例時,Spring都會返回一個新實例。
Struts通過插件集成到Spring。 確保它有
<constant name="struts.objectFactory" value="spring" />
然后可以將動作委派給Spring
參考文獻:
編輯:
在第一個配置中,您聲明了一個bean zooService
,它將由Struts使用spring
對象工廠注入。
在第二個配置中,您聲明了兩個bean zooController
和zooServiceBean
,但是您更改了第二個bean的名稱。 然后,您嘗試像第一種情況一樣使用spring
對象工廠來構建action bean。 並且因為沒有名稱為zooService
的bean,所以自動裝配已失敗。 因為默認情況下,Struts配置為按名稱從應用程序上下文自動裝配bean。
然后,您更改了struts.xml
並在操作類屬性中使用了bean引用。 這意味着Struts將使用應用上下文從Spring獲取Bean。 並且由於它對第二個bean有明確的依賴關系,因此將在返回該bean之前進行連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.