亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

@Resource和@Autowired注解區別是什么

發布時間:2023-04-18 17:29:38 來源:億速云 閱讀:110 作者:iii 欄目:開發技術

這篇文章主要介紹“@Resource和@Autowired注解區別是什么”,在日常操作中,相信很多人在@Resource和@Autowired注解區別是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”@Resource和@Autowired注解區別是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

引言

@Resource和@Autowired都是Spring Framework中用于依賴注入的注解,但它們有幾點不同:

來源不同:@Resource注解來自于J2EE規范中;而@Autowired注解是Spring框架提供的。

搜索策略不同:@Resource注解默認按照名稱進行匹配查找,如果找不到,則按照類型進行匹配。而@Autowired注解默認是按照類型進行匹配,如果出現多個類型一致的實例對象,則需要指定名稱。

屬性不同:@Resource注解沒有屬性名稱,只有一個name屬性,表示要注入的Bean名稱。而@Autowired注解有兩個重要屬性:required和name,其中required屬性表示是否必須注入該屬性,默認為true;name屬性表示要注入的Bean名稱。

1、用法層面分析

首先,我們創建一個接口UserService和兩個實現類UserServiceImpl1UserServiceImpl2

public interface UserService {
    void save();
}
@Service
public class UserServiceImpl1 implements UserService {
    @Override
    public void save() {
        System.out.println("UserServiceImpl1 save");
    }
}
@Service
public class UserServiceImpl2 implements UserService {
    @Override
    public void save() {
        System.out.println("UserServiceImpl2 save");
    }
}

然后,我們可以在需要使用UserService的地方進行依賴注入。

使用@Resource注解:

@Component
public class UserController {
    @Resource
    private UserService userService;
    // ...
}

使用@Autowired注解:

@Component
public class UserController {
    @Autowired(required = false)
    @Qualifier("userServiceImpl1")
    private UserService userService;
    // ...
}

上面的代碼中,@Resource注解直接將UserService對象注入到userService屬性中,而@Autowired注解需要結合@Qualifier注解來指定具體的Bean名稱,并且通過required屬性設置是否必須注入該屬性。注意,@Autowired注解也可以省略@Qualifier注解,此時會按照類型進行匹配查找對應的Bean。

2、概念層面分析

再來分析一下其中的道道~~

Spring Framework中的依賴注入實現原理是基于Java反射機制和JavaBean規范的。

  • 通過反射機制實例化對象

Spring框架通過反射機制實例化需要注入的Bean對象,并將其存儲到一個Map中,其中Key為Bean名稱,Value為Bean實例對象。

  • 通過JavaBean規范完成Bean屬性注入

接下來,Spring會根據JavaBean規范(即屬性名以及該屬性的setter方法)查找需要注入的屬性,并通過反射機制調用對應的setter方法進行屬性注入。

  • 依賴注入的搜索策略

在依賴注入的過程中,Spring框架通常采用兩種搜索策略:

  • 按照類型搜索:當需要注入的屬性的類型與容器中的多個Bean的類型一致時,會根據不同的注解選擇不同的搜索策略。比如使用@Autowired注解時,默認按照類型匹配查找對應的Bean。

  • 按照名稱搜索:當需要注入的屬性的類型不唯一,或者需要注入的Bean名稱與屬性名稱不一致時,可以使用@Qualifier注解指定要注入的Bean名稱。

  • 使用各種注解進行依賴注入

Spring框架提供了多種注解用于依賴注入,包括:

  • @Autowired:按照類型進行注入;

  • @Resource:按照名稱進行注入;

  • @Value:注入簡單類型或字符串類型的屬性;

  • @Inject:JSR-330標準定義的注解,功能與@Autowired類似。

Spring Framework的依賴注入實現原理是基于Java反射機制和JavaBean規范的,并通過多種注解實現不同的依賴注入方式。

@Resource和@Autowired都是Spring的依賴注入注解,但它們有如下區別:

  • 來源不同:@Resource是Java EE規范定義的注解,而@Autowired是Spring提供的注解。

  • 屬性不同:@Resource注解沒有required屬性,只有name屬性,表示要注入的Bean名稱;而@Autowired注解有required和name屬性,其中required表示是否必須注入該屬性,默認為true;name表示要注入的Bean名稱。

  • 查找方式不同:@Resource注解默認是根據byName的方式進行查找,如果找不到則按照byType進行查找;而@Autowired默認是根據byType方式進行查找。

  • 兼容性不同:@Resource注解可以與JSR-330的@Inject注解搭配使用;而@Autowired注解只能與Spring組件一起使用。

  • 應用場景不同:@Resource注解主要應用于Java EE環境,而@Autowired注解則是在Spring框架中使用最廣泛的依賴注入注解之一,可以適用于不同的應用場景。

下面分別介紹@Resource和@Autowired注解的優缺點:

@Resource優點:

  • 簡單易用,在類中使用非常方便。

  • 可以和@Inject注解一起使用。

  • 支持指定Bean名稱,可以更精確地進行依賴注入。

@Resource缺點:

  • Spring框架對@Resource注解的支持不如@Autowired豐富。

  • 僅支持byName和byType兩種注入方式,比@Autowired的支持更為有限。

@Autowired優點:

  • 支持復雜的依賴注入配置,可以通過多種方式進行依賴注入。

  • Spring框架對@Autowired注解的支持非常豐富,是Spring中使用最廣泛的注解之一。

  • 可以指定是否必須注入該屬性,也可以指定Bean名稱進行注入。

  • 除了在類中使用之外,還可以在構造方法、Setter方法及任何標記了@Bean的方法中使用@Autowired注解。

@Autowired缺點:

  • 配置較為繁瑣,需要指定required和name屬性等。

  • 需要遵循Spring的自動掃描機制,只有標記了@Component、@Service、@Controller和@Repository等注解的類才會被Spring容器進行管理。

對于依賴注入的原理,可以簡單地概括為以下三個步驟:

  • 在應用程序啟動時,Spring容器負責創建和管理所有的Bean實例對象。

  • 在需要使用某個Bean的時候,Spring容器會通過反射機制將該Bean注入到需要使用的類或對象中。

  • 在Bean注入的過程中,Spring容器會根據不同的注解(如@Resource、@Autowired)采用不同的依賴注入方式,完成依賴注入的過程。

@Resouce和@Autowired都是Spring提供的依賴注入注解,各有優缺點。在實際開發中,可以根據具體的應用場景選擇合適的注解進行使用。

3、源碼層面分析

在Spring Framework源碼層面,@Resource和@Autowired注解的實現類分別為javax.annotation.Resource和org.springframework.beans.factory.annotation.Autowired。下面我們來看一下它們的具體實現。

@Resource注解的實現原理:

  • 如果@Resource注解的name屬性不為空,則Spring容器根據該屬性值查找需要注入的Bean實例對象;如果name屬性為空,則默認使用字段名作為Bean名稱進行查找。

  • Spring容器會先根據byName注入方式進行查找,如果沒有找到對應的Bean實例,則根據byType方式進行查找。

  • 如果找到了對應的Bean實例,則使用反射機制將該Bean實例注入到需要使用該實例的類或對象中。

  • 如果沒有找到對應的Bean實例,則拋出NoSuchBeanDefinitionException異常。

代碼示例:

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Resource {
    String name() default "";
    Class<?> type() default java.lang.Object.class;
    boolean shareable() default true;
}

@Autowired注解的實現原理:

  • Spring容器會根據AutowiredAnnotationBeanPostProcessor類和AutowiredAnnotationBeanPostProcessor類的派生類進行處理,將使用@Autowired注解標記的所有屬性注入到需要使用的類或對象中。

  • 對于AutowiredAnnotationBeanPostProcessor,其實現了BeanPostProcessor接口,在Bean實例化、初始化的過程中會攔截@Autowired注解。

  • 當Spring容器遇到@Autowired注解時,會自動調用AutowiredAnnotationBeanPostProcessor類的postProcessPropertyValues方法,該方法會根據不同的注解屬性值進行不同的依賴注入處理。

  • 在處理@Autowired注解時,Spring容器默認使用byType的方式進行查找,如果存在多個匹配類型的Bean,則根據類名進行匹配;如果仍然無法確定注入哪個Bean,則拋出NoSuchBeanDefinitionException異常。

代碼示例:

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
    boolean required() default true;
    String value() default "";
}

無論是@Resource注解還是@Autowired注解,在Spring Framework源碼實現上都是通過反射機制和BeanPostProcessor接口完成依賴注入的。在實際開發中,我們可以研究對應的源碼實現,深入了解它們的原理,從而更好地使用這些依賴注入注解。

到此,關于“@Resource和@Autowired注解區別是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

博爱县| 河池市| 武安市| 蓬莱市| 双牌县| 花垣县| 成武县| 囊谦县| 宁阳县| 久治县| 连城县| 白朗县| 正镶白旗| 日喀则市| 乌海市| 姜堰市| 抚远县| 张家界市| 那曲县| 罗平县| 平阳县| 怀远县| 南陵县| 宝山区| 万全县| 房产| 浪卡子县| 镇雄县| 获嘉县| 桦川县| 贺兰县| 金乡县| 天全县| 南昌县| 芮城县| 海南省| 南陵县| 雷州市| 肃南| 贵州省| 东丽区|