【Spring注解驅動開發】你還不會使用@Resource和@Inject注解?那你就out了!!


寫在前面

我在 冰河技術 微信公眾號中發表的《【Spring注解驅動開發】使用@Autowired@Qualifier@Primary三大注解自動裝配組件,你會了嗎?》一文中,介紹了如何使用@Autowired、@Qualifier和@Primary注解自動裝配Spring組件。那除了這三個注解以外,還有沒有其他的注解可以自動裝配組件呢?那必須有啊!今天,我們就一起說說@Resource注解和@Inject注解。

關注 冰河技術 微信公眾號,回復 “Spring注解”關鍵字領取源碼工程。

@Resource注解

@Resource(這個注解屬於J2EE的,JSR250),默認安照名稱進行裝配,名稱可以通過name屬性進行指定, 如果沒有指定name屬性,當注解寫在字段上時,默認取字段名進行按照名稱查找,如果注解寫在setter方法上默認取屬性名進行裝配。 當找不到與名稱匹配的bean時才按照類型進行裝配。但是需要注意的是,如果name屬性一旦指定,就只會按照名稱進行裝配。

@Resource注解的源碼如下所示。

package javax.annotation;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
@Target({TYPE, FIELD, METHOD})
@Retention(RUNTIME)
public @interface Resource {
    String name() default "";
    String lookup() default "";
    Class<?> type() default java.lang.Object.class;
    enum AuthenticationType {
            CONTAINER,
            APPLICATION
    }
    AuthenticationType authenticationType() default AuthenticationType.CONTAINER;
    boolean shareable() default true;
    String mappedName() default "";
    String description() default "";
}

@Inject注解

@Inject注解(JSR330)默認是根據參數名去尋找bean注入,支持spring的@Primary注解優先注入,@Inject注解可以增加@Named注解指定注入的bean。

@Inject注解的源碼如下所示。

package javax.inject;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import java.lang.annotation.Documented;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
@Target({ METHOD, CONSTRUCTOR, FIELD })
@Retention(RUNTIME)
@Documented
public @interface Inject {}

注意:要想使用@Inject注解,需要在項目的pom.xml文件中添加如下依賴。

<dependency>
    <groupId>javax.inject</groupId>
    <artifactId>javax.inject</artifactId>
    <version>1</version>
</dependency>

項目案例

測試@Resource注解

首先,我們將項目中的PersonService類標注在personDao字段上的@Autowired注解和@Qualifier注解注釋掉,然后添加@Resource注解,如下所示。

//@Qualifier("personDao")
//@Autowired(required = false)
@Resource
private PersonDao personDao;

接下來,我們運行AutowiredTest類的testAutowired01()方法,輸出的結果信息如下所示。

PersonService{personDao=PersonDao{remark='1'}}

可以看到,使用@Resource注解也能夠自動裝配組件,只不過此時自動裝配的是remark為1的personDao。而不是我們在AutowiredConfig類中配置的優先裝配的remark為2的personDao。AutowiredConfig類中配置的remark為2的personDao如下所示。

@Primary
@Bean("personDao2")
public PersonDao personDao(){
    PersonDao personDao = new PersonDao();
    personDao.setRemark("2");
    return personDao;
}

我們在使用@Resource注解時,可以通過@Resource注解的name屬性顯示指定要裝配的組件的名稱。例如,我們要想裝配remark為2的personDao,只需要為@Resource注解添加 name="personDao2"屬性即可。如下所示。

//@Qualifier("personDao")
//@Autowired(required = false)
@Resource(name = "personDao2")
private PersonDao personDao;

接下來,我們再次運行AutowiredTest類的testAutowired01()方法,輸出的結果信息如下所示。

PersonService{personDao=PersonDao{remark='2'}}

可以看到,此時輸出了remark為2的personDao,說明@Resource注解可以通過name屬性顯示指定要裝配的bean。

測試@Inject注解

在PersonService類中,將@Resource注解注釋掉,添加@Inject注解,如下所示。

//@Qualifier("personDao")
//@Autowired(required = false)
//@Resource(name = "personDao2")
@Inject
private PersonDao personDao;

修改完畢后,我們運行AutowiredTest類的testAutowired01()方法,輸出的結果信息如下所示。

PersonService{personDao=PersonDao{remark='2'}}

可以看到,使用@Inject注解默認輸出的是remark為2的personDao。這是因為@Inject注解和@Autowired注解一樣,默認優先裝配使用了@Primary注解標注的組件。

@Resource和@Inject注解與@Autowired注解的區別

不同點

  • @Autowired是spring專有注解,@Resource是java中JSR250中的規范,@Inject是java中JSR330中的規范
  • @Autowired支持參數required=false,@Resource,@Inject都不支持
  • @Autowired,和@Inject支持@Primary注解優先注入,@Resource不支持
  • @Autowired通過@Qualifier指定注入特定bean,@Resource可以通過參數name指定注入bean,@Inject需要@Named注解指定注入bean

相同點

三種注解都可以實現bean的注入。

重磅福利

關注「 冰河技術 」微信公眾號,后台回復 “設計模式” 關鍵字領取《深入淺出Java 23種設計模式》PDF文檔。回復“Java8”關鍵字領取《Java8新特性教程》PDF文檔。回復“限流”關鍵字獲取《億級流量下的分布式限流解決方案》PDF文檔,三本PDF均是由冰河原創並整理的超硬核教程,面試必備!!

好了,今天就聊到這兒吧!別忘了點個贊,給個在看和轉發,讓更多的人看到,一起學習,一起進步!!

寫在最后

如果你覺得冰河寫的還不錯,請微信搜索並關注「 冰河技術 」微信公眾號,跟冰河學習高並發、分布式、微服務、大數據、互聯網和雲原生技術,「 冰河技術 」微信公眾號更新了大量技術專題,每一篇技術文章干貨滿滿!不少讀者已經通過閱讀「 冰河技術 」微信公眾號文章,吊打面試官,成功跳槽到大廠;也有不少讀者實現了技術上的飛躍,成為公司的技術骨干!如果你也想像他們一樣提升自己的能力,實現技術能力的飛躍,進大廠,升職加薪,那就關注「 冰河技術 」微信公眾號吧,每天更新超硬核技術干貨,讓你對如何提升技術能力不再迷茫!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM