<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          招銀網絡一面:@Autowired 和 @Resource 的區(qū)別是什么?

          共 1868字,需瀏覽 4分鐘

           ·

          2022-04-15 22:35


          下面是正文。

          Spring 內置的?@Autowired?以及 JDK 內置的?@Resource?和?@Inject?都可以用于注入 Bean。

          AnnotaionPackageSource
          @Autowiredorg.springframework.bean.factorySpring 2.5+
          @Resourcejavax.annotationJava JSR-250
          @Injectjavax.injectJava JSR-330

          @Autowired?和@Resource使用的比較多一些。

          Autowired?屬于 Spring 內置的注解,默認的注入方式為byType(根據類型進行匹配),也就是說會優(yōu)先根據接口類型去匹配并注入 Bean (接口的實現類)。

          這會有什么問題呢??當一個接口存在多個實現類的話,byType這種方式就無法正確注入對象了,因為這個時候 Spring 會同時找到多個滿足條件的選擇,默認情況下它自己不知道選擇哪一個。

          這種情況下,注入方式會變?yōu)?byName(根據名稱進行匹配),這個名稱通常就是類名(首字母小寫)。就比如說下面代碼中的?smsService?就是我這里所說的名稱,這樣應該比較好理解了吧。

          //?smsService?就是我們上面所說的名稱
          @Autowired
          private?SmsService?smsService;

          舉個例子,SmsService?接口有兩個實現類:?SmsServiceImpl1和?SmsServiceImpl2,且它們都已經被 Spring 容器所管理。

          //?報錯,byName?和?byType?都無法匹配到?bean
          @Autowired
          private?SmsService?smsService;
          //?正確注入?SmsServiceImpl1?對象對應的?bean
          @Autowired
          private?SmsService?smsServiceImpl1;
          //?正確注入??SmsServiceImpl1?對象對應的?bean
          //?smsServiceImpl1?就是我們上面所說的名稱
          @Autowired
          @Qualifier(value?=?"smsServiceImpl1")
          private?SmsService?smsService;

          我們還是建議通過?@Qualifier?注解來顯示指定名稱而不是依賴變量的名稱。

          @Resource屬于 JDK 提供的注解,默認注入方式為?byName。如果無法通過名稱匹配到對應的實現類的話,注入方式會變?yōu)?code style="font-size: 14px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(41, 128, 185);background-color: rgba(27, 31, 35, 0.05);word-break: break-all;">byType。

          @Resource?有兩個比較重要且日常開發(fā)常用的屬性:name(名稱)、type(類型)。

          public?@interface?Resource?{
          ????String?name()?default?"";
          ????Class?type()?default?Object.class;
          }

          如果僅指定?name?屬性則注入方式為byName,如果僅指定type屬性則注入方式為byType,如果同時指定name?和type屬性(不建議這么做)則注入方式為byType+byName。

          //?報錯,byName?和?byType?都無法匹配到?bean
          @Resource
          private?SmsService?smsService;
          //?正確注入?SmsServiceImpl1?對象對應的?bean
          @Resource
          private?SmsService?smsServiceImpl1;
          //?正確注入?SmsServiceImpl1?對象對應的?bean(比較推薦這種方式)

          @Resource(name?=?"smsServiceImpl1")
          private?SmsService?smsService;

          簡單總結一下:

          • @Autowired?是 Spring 提供的注解,@Resource?是 JDK 提供的注解。
          • Autowired?默認的注入方式為byType(根據類型進行匹配),@Resource默認注入方式為?byName(根據名稱進行匹配)。
          • 當一個接口存在多個實現類的情況下,@Autowired?和@Resource都需要通過名稱才能正確匹配到對應的 Bean。Autowired?可以通過?@Qualifier?注解來顯示指定名稱,@Resource可以通過?name?屬性來顯示指定名稱。

          ··········? END? ··············

          瀏覽 123
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩一区二区三区免费视频 | 日本网站在线 | 肏屄乱伦网站 | 国产女人水真多18毛片18精品 | 色天堂视频在线观看 |