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

          Intellij IDEA 中 Mybatis Mapper 自動(dòng)注入警告的 6 種解決方案

          共 2114字,需瀏覽 5分鐘

           ·

          2019-06-15 08:02

          相信使用Mybaits的小伙伴們一定會(huì)經(jīng)常編寫(xiě)類(lèi)似如下的代碼:


          J10 01.jpg


          可以看到?userMapper?下有個(gè)紅色警告。雖然代碼本身并沒(méi)有問(wèn)題,能正常運(yùn)行,但有個(gè)警告總歸有點(diǎn)惡心。本文分析原因,并列出解決該警告的幾種方案。


          原因


          眾所周知,IDEA是非常智能的,它可以理解Spring的上下文。然而?UserMapper?這個(gè)接口是Mybatis的,IDEA理解不了。


          而?@Autowired?注解,默認(rèn)情況下要求依賴(lài)對(duì)象(也就是?userMapper?)必須存在。而IDEA認(rèn)為這個(gè)對(duì)象的實(shí)例/代理是個(gè)null,所以就友好地給個(gè)提示


          解決方案


          方法1:為?@Autowired?注解設(shè)置required = false


          使用?@Autowired?注解時(shí),若希望允許null值,可設(shè)置required = false,像這樣:

          1. @Autowired(required = false)

          2. private UserMapper userMapper;


          這樣就不會(huì)有警告了。原因很好理解:IDEA認(rèn)為userMapper是個(gè)null,給了警告;加上required = false后,使用?@Autowired?注解不再去校驗(yàn)userMapper是否存在了。也就不會(huì)有警告了。


          總結(jié):這種方式有點(diǎn)蛋疼。一個(gè)龐大的既有項(xiàng)目,可能到處都在引用Mapper,總不能到處都補(bǔ)上 required = false 吧……而且對(duì)于新手/新員工,很難一眼看懂加required = false屬性只是為了解決IDEA的警告。


          方法2:用?@Resource?替換?@Autowired


          像這樣:

          1. @Resource

          2. private UserMapper userMapper;


          這樣也不會(huì)再有討厭的警告。如果你對(duì)原因感興趣,不妨了解一下《@Autowired 與@Resource的區(qū)別》[1]


          總結(jié):這種方式挺贊,但如果一個(gè)項(xiàng)目已經(jīng)大量使用@Autowired,然后為了個(gè)警告到處改成@Resource,也有點(diǎn)蛋疼。


          方法3:在Mapper接口上加上@Repository注解

          像這樣:

          1. @Repository

          2. public interface UserMapper extends Mapper<User> {


          這樣也能讓你的

          1. @Autowired

          2. private UserMapper userMapper;


          不再報(bào)錯(cuò)。


          當(dāng)然,如果你用@Component替換@Repository也是可以的。原理大致:IDEA不是認(rèn)為?userMapper?是個(gè)null嘛…加個(gè)@Repository注解騙一下IDEA就OK了……


          總結(jié):這種方式比較贊,改動(dòng)小,也簡(jiǎn)單,我比較喜歡。


          方法4:用Lombok


          像這樣:

          1. @Service

          2. @RequiredArgsConstructor(onConstructor = @__(@Autowired))

          3. public class TestService {

          4. private final UserMapper userMapper;

          5. ...

          6. }


          Lombok生成的代碼是這樣的:

          1. @Service

          2. public class TestService {

          3. private final UserMapper userMapper;

          4. @Autowired

          5. public TestService(final UserMapper userMapper) {

          6. this.userMapper = userMapper;

          7. }

          8. ...

          9. }


          但如果自己手寫(xiě)成Lombok生成的代碼,IDEA依然會(huì)給你報(bào)警告?。我猜,應(yīng)該是IDEA的Lombok插件把IDEA搞懵逼了…所以不提示了…


          總結(jié)?:這是我目前最喜歡的方式。原因有2:


          ?Spring官方并不建議直接在類(lèi)的field上使用@Autowired注解,原因詳見(jiàn):《Why field injection is evil》[2]?,用本方法可將field注入編程構(gòu)造方法注入,Spring是比較推薦的。?體現(xiàn)了Lombok的優(yōu)勢(shì),簡(jiǎn)化了你的代碼。而且你也不用在每個(gè)field上都加上@Autowired注解了。


          不過(guò)這種方式也有缺點(diǎn):那就是如果你類(lèi)之間的依賴(lài)關(guān)系比較復(fù)雜,特別是存在循環(huán)依賴(lài)(A引用B,B引用A,或者間接引用)時(shí),引用將會(huì)啟動(dòng)不起來(lái)……這其實(shí)是構(gòu)造方法注入方式的缺點(diǎn)


          方法5:把IDEA的警告關(guān)閉掉


          個(gè)人沒(méi)試過(guò),也沒(méi)有動(dòng)力去試。沒(méi)有提示的IDEA是沒(méi)有靈魂的,我從來(lái)不去修改IDEA的任何警告設(shè)置。


          方法6:安裝mybatis plugin


          據(jù)說(shuō)安裝mybatis plugin可以解決該問(wèn)題。不過(guò)這個(gè)插件是收費(fèi)的,我沒(méi)有錢(qián)去嘗試。有錢(qián)的讀者們可以告訴我一下是不是真的。


          總結(jié)


          以上是解決問(wèn)題的6種方法。問(wèn)題本身其實(shí)比較簡(jiǎn)單,但其實(shí)隱藏的知識(shí)點(diǎn)其實(shí)挺多的,例如:


          ?@Autowired和@Resource有什么區(qū)別?為什么Spring不建議使用field方式注入?@Repository、@Componnt、@Controller、@Service有什么區(qū)別


          總之,硬貨有時(shí)候就隱藏在很low的問(wèn)題之下,哈哈哈。




          瀏覽 63
          點(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>
                  欧美精品18videosex性欧美 | 91AV免费在线观看 | 人人干人人插人人摸 | 天堂网二区 | 久久伊人大|