天天看點

Spring(17)——對JSR330标準的支援17 對JSR330标準注解的支援

除了使用Spring标準的注解來定義bean、定義bean之間的依賴關系外,Spring還支援使用JSR330标準的注解來進行相關的定義,主要是對@Inject和@Named兩個注解的支援。

要使用JSR330标準的注解進行對應的bean定義,我們首先需要将JSR330标準對應的jar包加入我們的classpath。筆者習慣使用Maven來管理相應的依賴,是以筆者隻需要在項目的pom.xml檔案中加入如下依賴項即可。

@Inject注解的功能相當于Spring标準中的@Autowired注解的功能。其是用來定義自動注入的,而且與@Autowired一樣,@Inject可以标注在field、method或constructor上。

1、标注在field上

2、标注在method上

對于方法注入的情況也可以通過一個方法同時注入多個bean,具體如下所示。

3、标注在constructor上

@Inject在進行自動注入時預設會根據field的名稱、method參數的名稱尋找對應的bean進行注入,當然這種機制也可以通過@Named或@Qualifier來進行改變。如在上述示例中@Inject标注在field上的情況,我們看到對應的field的名稱為“world”,那麼當我們的bean容器中有如下兩個bean時,将預設注入beanName為world的那個bean。

同樣的機制對于方法注入和構造方法注入也是适用的。就這一點而言,我覺得@Inject比@Autowired好用。當容器中不存在對應名稱的bean時,将根據類型進行注入,當容器中不存在對應類型時Spring将抛出異常,@Inject沒有像@Autowired那樣可以指定是否required的屬性,是以一旦我們配置了某個field或method等為@Inject,那麼bean容器中就一定需要存在對應類型的bean,否則Spring就将抛出異常。另外,當容器中不存在@Inject所标注的field對應名稱或method對應參數名稱的bean存在時,Spring将根據類型進行注入,如果此時bean容器中存在相同類型的多個bean時,Spring也會抛出異常。這個時候我們就可以通過@Named來指定具體需要注入哪個bean,當然使用@Autowired支援的@Qualifier也是可以的。

@Named的功能就相當于Spring标準注解中的@Qualifier。與@Qualifier一樣,@Named注解也可以标注在任何@Inject或@Autowired出現的地方,如field、方法參數等。同時@Named也可以标注在類上,當使用@Named标注在類上時其功能就相當于在類上使用@Component進行标注,通過其value屬性也可以指定Spring掃描後添加bean定義時對應bean的beanName。而@Qualifier标注在類上時隻是定義對應bean的qualifier。

上述示例我們使用@Named明确的表示将注入beanName為“world1”的那個bean。需要注意的是使用@Named進行标注時将尋找對應beanName的bean,且一定是beanName,這一點與@Qualifier是不一樣的,@Qualifier還可以對應對應bean的qualifier。如上述@Named(“world1”)對應如下這樣的配置是行不通的,但如果将@Named(“world1”)替換成@Qualifier(“world1”)它又是可以的。

如下是一個使用@Named标注在通過方法進行注入的方法參數上的示例。

當使用@Named标注在類上時,其功能和用法都與@Component是一樣的。如果我們啟用了Spring掃描類路徑的功能,那麼Spring預設也會掃描标注了@Named的類,并将它們作為一個bean定義到對應的bean容器中。如下就是一個使用@Named标注在類上的示例。

使用@Named标注在類上時,如果沒有通過value屬性指定對應的beanName,則預設會取類名将首字母小寫作為對應的beanName。如上述示例,預設就将使用“hello”作為beanName。

(注:本文是基于Spring4.1.0所寫)