簡體   English   中英

用於依賴注入的Spring配置

[英]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 zooControllerzooServiceBean ,但是您更改了第二個bean的名稱。 然后,您嘗試像第一種情況一樣使用spring對象工廠來構建action bean。 並且因為沒有名稱為zooService的bean,所以自動裝配已失敗。 因為默認情況下,Struts配置為按名稱從應用程序上下文自動裝配bean。

然后,您更改了struts.xml並在操作類屬性中使用了bean引用。 這意味着Struts將使用應用上下文從Spring獲取Bean。 並且由於它對第二個bean有明確的依賴關系,因此將在返回該bean之前進行連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM