簡體   English   中英

關閉Spring @Service的自動裝配

[英]Turn off Autowiring for Spring @Service

我有一個自定義注釋,它被聲明為Spring托管服務:

@Service
public @interface MyServiceAnnotation {
    // my service url
    String url();
}

The above declaration enables my services to be autowired as Spring Managed beans.
@MyServiceAnnotation(url="/path/serviceLocation")
public class SomeService {
   doWork();
}

但是,某些服務在applicationContext.xml中具有其bean定義。 @MyServiceAnnotation添加到此類bean可以使它們既啟用自動裝配功能,又可以通過xml文件注入依賴項。

由於與遺留代碼相關的問題,我不想刪除xml bean定義並使它們全部自動裝配。

因此,在這種情況下,有沒有一種方法可以關閉自動裝配,並且仍然使用@MyServiceAnnotation 理想情況下,我希望在MyServiceAnnotation上具有@Service批注,現有服務仍將使用@MyServiceAnnotation但將基於xml注入其依賴項。 如果沒有xml bean定義,所有新服務將自動裝配。

一種可能的方法是創建與MyServiceAnnotation相同的NonSpringManagedMyServiceAnnotation ,但上面沒有@Service注釋。 這樣做的缺點是我不得不復制MyServiceAnnotation其余代碼,這些代碼我是不希望的。

這是一種方法,雖然可能不是最佳的。 我假設您已經在xml中指定了一個component-scan標簽來掃描具有Spring構造型注釋的類,這些標簽支持exclude-filter子標簽來忽略特定的模式。 如果您指定的文件遵循特定的模式(特定的程序包,特定的名稱等),則您可以簡單地指定此子標記來忽略包含注釋的類。

<context:component-scan base-package="mypackage">
    <context:exclude-filter type="regex" expression=".*ToBeIgnoredNaming"/>
</context:component-scan>

我認為您應該嘗試保持關注分離。

在注解上添加@Service使其成為事實上的Spring服務:由於這不是您想要的行為,因此您可以在每個服務(舊版和新版)上簡單地使用一個簡單的@MyAnnotation (帶有url屬性)。 然后,在每個新服務上添加Spring的@Service批注以通過批注啟用Bean注冊。

暫無
暫無

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

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