2010-09-18 365 views
0

我對Spring DI相當陌生。 我們有兩個類,PhysicalService和PhysicalDAO。物理服務實例是使用某個服務處理程序動態創建的,因此它不是spring管理bean。物理DAO實例由Spring Beans管理。有什麼方法可以在實際服務中注入物理道?Spring依賴注入

+0

'使用某些服務處理程序動態創建'它是什麼樣的處理程序? 或者您創建PhysicalServiceFactory類來創建PhysicalService實例? – 2010-09-18 11:51:41

回答

1

服務處理程序是spring bean嗎?然後,您可以將DAO注入到服務處理程序中,並且服務處理程序可以在創建它時將其提供給服務。

或者,您可以使用lookup injection將原型服務bean注入到處理程序中,從而有效地在處理程序中提供一個工廠方法,要求spring實例化該服務。

這就是說,我想知道爲什麼你需要一個服務處理程序?你確定你不能使用spring創建服務嗎?

編輯:如果你能擺脫屬性文件我把所有的服務到Spring Bean其ID匹配提供給處理程序的ID,注入應用程序上下文到服務處理程序,並做到:

public Object getInstance(String id) { 
    return applicationContext.getBean(id); 
} 

要遷移屬性文件Spring bean定義,我會使用正則表達式替換。

+0

我tryig重構現有的代碼。服務處理程序正在使用工廠模式,並且正在基於某個ID創建服務實例。我們有getInstance(String id)方法,基於id,我們從屬性文件獲取類名併爲其創建實例。 – 2010-09-18 11:14:32

0

你說ServiceHandler使用工廠模式打包PhysicalService。

首先,您必須將PhysicalDAO注入工廠,您可以在春季環境中定義它或使用自動佈線註記。

//spring-context.xml 
<bean id="physicalDAO" class="package.dao.PhysicalDAO"> 
//inject reference needed by dao class 
</bean> 

<bean id="physicalServiceFactory" class="package.service.PhysicalServiceFactory"> 
     <property name="physicalDAO" ref="physicalDAO " ></property> 
</bean> 

,並在你的工廠類,你可以按如下編寫代碼:

PhysicalServiceFactory { 
    private PhysicalDAO physicalDAO; 

    public void setPhysicalDAO(PhysicalDAO _physicalDAO) { 
     physicalDAO = _physicalDAO; 
    } 

    public PhysicalService create(String id) { 
     PhysicalService ps = PhysicalService(id); 
     ps.setPhysicalDAO(physicalDAO); 
      return ps; 
    } 
} 
0

只要你的應用程序是春天的具體應用,下面簡單的步驟,可能有助於在註釋的方式注入PhysicalDAO到PhysicalService。

//Add this spring annotation to add your DAO class to Spring container 
@Component("physicalDAO") 
public class PhysicalDAO { 

} 

//Add Service class with PhysicalDAO object reference to use. 
public class PhysicalService { 

    @Autowired 
    PhysicalDAO physicalDAO; 

} 

定義下面的條目給你彈簧配置文件。

<context:annotation-config></context:annotation-config> 
<context:component-scan base-package="com.cognizant.aop.annotation"></context:component-scan>