2016-11-18 65 views
1

在我的類,它擴展WebMvcConfigurerAdapter我要添加攔截這樣攔截器必須是豆嗎?

@Override 
    public void addInterceptors(InterceptorRegistry registry) { 
     super.addInterceptors(registry); 
     registry.addInterceptor(new MyInterceptor()); 
    } 

MyInterceptor已被宣佈爲一個bean,或者我可以只實例化對我自己是這樣的?

回答

1

根據官方文檔,如果你在xml配置中聲明它們,攔截器應該是Spring bean。

你調用的方法:

InterceptorRegistration addInterceptor(HandlerInterceptor interceptor) 

https://docs.spring.io/spring/docs/4.0.3.RELEASE/javadoc-api/org/springframework/web/servlet/HandlerInterceptor.html

org.springframework.web.servlet

接口的HandlerInterceptor

攔截器本身被定義爲應用 上下文中的bean,由映射bean定義通過其 「攔截器」屬性(在XML:a中)引用。

更新

什麼javaguy指是讓春天使bean的實例。它的基礎是你的攔截器遵循無狀態原則。
爲了實現這個功能,你的攔截器不應該有狀態(在攔截器執行期間會改變的內部屬性)。
作爲一般規則,在可能的情況下,處理類應該儘量不保持狀態。

在這裏,您可以如何與春天創建單攔截:

@Configuration 
public class YourSpringConf{ 

    @Bean 
    public HandlerInterceptor myInterceptor() { 
     return new MyInterceptor(); 
    } 
} 

這樣,你將有一個名爲豆由myInterceptor Spring管理,你可以在addInterceptors()方法注入它。

+0

謝謝。它似乎仍然有可能引起爭議,因爲如果你通過XML設置它們,唯一的選擇是將它們聲明爲bean,而使用Java,我們有能力自己實例化這些類。 – zero01alpha

+0

我剛剛在我的示例中進行了簡單實例化測試,到目前爲止,所有工作都與以前一樣(iI從xml遷移到Java配置) – zero01alpha

+0

xml配置冗長並創建了一些間接點。所以,確實,使用java版本來實例化你的bean似乎更相關。 – davidxxx

1

將MyInterceptor聲明爲一個bean或者我可以只是 像我這樣自己實例化它?

已經由大衛回答,只是增加一分:

如果有一個單獨的對象,那麼它始終是更好地離開它的Spring容器維護/管理它作爲一個單身作用域bean (默認範圍),而不是開發人員手動使用new MyInterceptor()並創建&確保類的單個實例。

這個概念不僅適用於MyInterceptor,而是所有單例作用域對象(如服務,DAO,過濾器等)都需要遵循。

進一步說明:

我的意思是,當你已經採取了控制(創建)少數豆類(如攔截器),然後在時間的一段時間後,你的應用程序將在結束凌亂的狀態,即一些singleton bean由Spring Container維護,一些bean由開發人員使用new運算符創建(不容易區分造成大量混淆)。所以最好的做法是將所有單例範圍bean(至少)的創建留給Spring容器本身。

+0

感謝您的闡述。你能解釋一下如何創建另一個MyInterceptor實例的例子嗎?我知道Spring確保「只能有一個」,但是如何創建另一個呢?如果我在Spring只運行一次的方法內部使用'new'關鍵字,它又會如何發生。只是好奇! – zero01alpha

+1

我的意思是,當你正在控制幾個bean的創建(很少有像攔截器)時,那麼在某個時候,你最終會陷入混亂(混亂的狀態),即哪些單例bean被Spring維護容器和由開發人員創建的容器不能輕易區分。 – developer