<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>

          Spring常用注解@Autowire和@Resource的區(qū)別

          共 3777字,需瀏覽 8分鐘

           ·

          2022-03-16 14:25

          ??Java大聯(lián)盟

          ? 致力于最高效的Java學(xué)習(xí)

          關(guān)注




          原文鏈接
          https://sourl.cn/P8S4xx



          B 站搜索:楠哥教你學(xué)Java

          獲取更多優(yōu)質(zhì)視頻教程



          介 紹


          今天使用Idea寫代碼的時(shí)候,看到之前的項(xiàng)目中顯示有warning的提示,去看了下,是如下代碼?

          @Autowireprivate JdbcTemplate jdbcTemplate;
          提示的警告信息

          “Field injection is not recommended Inspection info: Spring Team recommends: "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies".

          這段是Spring工作組的建議,大致翻譯一下:

          屬性字段注入的方式不推薦,檢查到的問題是:Spring團(tuán)隊(duì)建議:"始終在bean中使用基于構(gòu)造函數(shù)的依賴項(xiàng)注入,始終對(duì)強(qiáng)制性依賴項(xiàng)使用斷言"

          注入方式

          雖然當(dāng)前有關(guān)Spring Framework(5.0.3)的文檔僅定義了兩種主要的注入類型,但實(shí)際上有三種:

          基于構(gòu)造函數(shù)的依賴注入

          public class UserServiceImpl implents UserService{    private UserDao userDao;
          @Autowire public UserServiceImpl(UserDao userDao){ this.userDao = userDao; }}

          基于Setter的依賴注入

          public class UserServiceImpl implents UserService{     private UserDao userDao;
          @Autowire public serUserDao(UserDao userDao){ this.userDao = userDao; } }

          基于字段的依賴注入

          public class UserServiceImpl implents UserService{     @Autowire     private UserDao userDao; }
          基于字段的依賴注入方式會(huì)在Idea當(dāng)中吃到黃牌警告,但是這種使用方式使用的也最廣泛,因?yàn)楹啙嵎奖?您甚至可以在一些Spring指南中看到這種注入方法,盡管在文檔中不建議這樣做.(有點(diǎn)執(zhí)法犯法的感覺)。

          如圖


          基于字段的依賴注入缺點(diǎn)

          | 對(duì)于有final修飾的變量不好使

          Spring的IOC對(duì)待屬性的注入使用的是set形式,但是final類型的變量在調(diào)用class的構(gòu)造函數(shù)的這個(gè)過程當(dāng)中就得初始化完成,這個(gè)是基于字段的依賴注入?做不到的地方.只能使用基于構(gòu)造函數(shù)的依賴注入的方式

          | 掩蓋單一職責(zé)的設(shè)計(jì)思想

          我們都知道在OOP的設(shè)計(jì)當(dāng)中有一個(gè)單一職責(zé)思想,如果你采用的是基于構(gòu)造函數(shù)的依賴注入的方式來使用Spring的IOC的時(shí)候,當(dāng)你注入的太多的時(shí)候,這個(gè)構(gòu)造方法的參數(shù)就會(huì)很龐大,類似于下面。

          當(dāng)你看到這個(gè)類的構(gòu)造方法那么多參數(shù)的時(shí)候,你自然而然的會(huì)想一下:這個(gè)類是不是違反了單一職責(zé)思想??.但是使用基于字段的依賴注入不會(huì)讓你察覺,你會(huì)很沉浸在@Autowire當(dāng)中。

          public class VerifyServiceImpl implents VerifyService{
          private AccountService accountService; private UserService userService; private IDService idService; private RoleService roleService; private PermissionService permissionService; private EnterpriseService enterpriseService; private EmployeeService employService; private TaskService taskService; private RedisService redisService; private MQService mqService;
          public SystemLogDto(AccountService accountService, UserService userService, IDService idService, RoleService roleService, PermissionService permissionService, EnterpriseService enterpriseService, EmployeeService employService, TaskService taskService, RedisService redisService, MQService mqService) { this.accountService = accountService; this.userService = userService; this.idService = idService; this.roleService = roleService; this.permissionService = permissionService; this.enterpriseService = enterpriseService; this.employService = employService; this.taskService = taskService; this.redisService = redisService; this.mqService = mqService; }}
          |?與Spring的IOC機(jī)制緊密耦合

          當(dāng)你使用基于字段的依賴注入方式的時(shí)候,確實(shí)可以省略構(gòu)造方法和setter這些個(gè)模板類型的方法,但是,你把控制權(quán)全給Spring的IOC了,別的類想重新設(shè)置下你的某個(gè)注入屬性,沒法處理(當(dāng)然反射可以做到)。

          本身Spring的目的就是解藕和依賴反轉(zhuǎn),結(jié)果通過再次與類注入器(在本例中為Spring)耦合,失去了通過自動(dòng)裝配類字段而實(shí)現(xiàn)的對(duì)類的解耦,從而使類在Spring容器之外無效。

          | 隱藏依賴性

          當(dāng)你使用Spring的IOC的時(shí)候,被注入的類應(yīng)當(dāng)使用一些public類型(構(gòu)造方法,和setter類型方法)的方法來向外界表達(dá):我需要什么依賴.但是基于字段的依賴注入的方式,基本都是private形式的,private把屬性都給封印到class當(dāng)中了。

          | 無法對(duì)注入的屬性進(jìn)行安檢

          基于字段的依賴注入方式,你在程序啟動(dòng)的時(shí)候無法拿到這個(gè)類,只有在真正的業(yè)務(wù)使用的時(shí)候才會(huì)拿到,一般情況下,這個(gè)注入的都是非null的,萬一要是null怎么辦,在業(yè)務(wù)處理的時(shí)候錯(cuò)誤才爆出來,時(shí)間有點(diǎn)晚了,如果在啟動(dòng)的時(shí)候就暴露出來,那么bug就可以很快得到修復(fù)(當(dāng)然你可以加注解校驗(yàn))。

          如果你想在屬性注入的時(shí)候,想根據(jù)這個(gè)注入的對(duì)象操作點(diǎn)東西,你無法辦到.我碰到過的例子:一些配置信息啊,有些人總是會(huì)配錯(cuò)誤,等到了自己測試業(yè)務(wù)階段才知道配錯(cuò)了,例如線程初始個(gè)數(shù)不小心配置成了3000,機(jī)器真的是狂叫啊!這個(gè)時(shí)候就需要再某些Value注入的時(shí)候做一個(gè)檢測機(jī)制。


          結(jié) 論

          通過上面,我們可以看到,基于字段的依賴注入方式有很多缺點(diǎn),我們應(yīng)當(dāng)避免使用基于字段的依賴注入。推薦的方法是使用基于構(gòu)造函數(shù)基于setter的依賴注入。對(duì)于必需的依賴項(xiàng),建議使用基于構(gòu)造函數(shù)的注入,以使它們成為不可變的,并防止它們?yōu)閚ull。對(duì)于可選的依賴項(xiàng),建議使用基于Setter的注入。



          推薦閱讀

          1、Spring Boot+Vue項(xiàng)目實(shí)戰(zhàn)

          2、B站:4小時(shí)上手MyBatis Plus

          3、一文搞懂前后端分離

          4、快速上手Spring Boot+Vue前后端分離


          楠哥簡介

          資深 Java 工程師,微信號(hào) nnsouthwind

          《Java零基礎(chǔ)實(shí)戰(zhàn)》一書作者

          騰訊課程官方 Java 面試官今日頭條認(rèn)證大V

          GitChat認(rèn)證作者,B站認(rèn)證UP主(楠哥教你學(xué)Java)

          致力于幫助萬千 Java 學(xué)習(xí)者持續(xù)成長。




          有收獲,就點(diǎn)個(gè)在看?
          瀏覽 46
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  欧美老熟妇性色XXXXx | 亚洲欧美中文日韩在线观看 | 91青娱乐极品盛宴 | 国产白丝在线 | 少妇在厨房 |