如何高效提昇Java開發效率—Spring注解開發全套教程,面試必知必會

程序員ioms 2021-09-18 03:34:43 阅读数:198

高效 java 效率 spring 注解

(1)掃描包含特定組件

**如果我們僅僅是想要掃描包含特定特征的組件,**那麼我們可以如下方法:

 context:include-filter子節點錶示要包含的目標類

但是需要注意的是:由於context:component-scan默認是將所有的類全部都添加進去,所以在此基礎上再添加是沒有用的,需要在context:component-scan中加入屬性參數use-default-filters,use-default-filters=“true” 錶示默認將所有的類都添加進去,false錶示將所有的類都不添加進去,

如下代碼錶示僅僅掃描包含include-filter中所指特征的組件,其中的type用來錶示使用何種類型的掃描錶達式,expression後面跟錶達式。


<context:component-scan base-package="com.spring" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

(2)掃描排除特定組件

盡然有掃描包含特定組件,那麼就有掃描排除特定組件,

 context:exclude-filter子節點錶示要排除在外的目標類。

以下代碼錶示掃描除以下特征外的其他組件。


<context:component-scan base-package="com.spring">
<context:exclude-filter type="assignable" expression="com.spring.service.BookService"/>
</context:component-scan>

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

同時component-scan下可以擁有若幹個include-filter和exclude-filter子節點,來錶示可以包含多個哪種特征的組件或排除具有哪種特征的組件。

關於上面說到的type中填寫的過濾錶達式類型及作用如下錶:

<table border=“1” cellspacing=“0” style=“margin-left:-15.9pt;width:487.5pt;”><tbody><tr><td style=“vertical-align:top;width:66.65pt;”><p style=“margin-left:.0001pt;text-align:justify;”>類別</p></td><td style=“vertical-align:top;width:128.6pt;”><p style=“margin-left:.0001pt;text-align:justify;”>示例</p></td><td style=“vertical-align:top;width:292.25pt;”><p style=“margin-left:.0001pt;text-align:justify;”>說明</p></td></tr><tr><td style=“vertical-align:top;width:66.65pt;”><p style=“margin-left:.0001pt;text-align:justify;”>annotation</p></td><td style=“vertical-align:top;width:128.6pt;”><p style=“margin-left:.0001pt;text-align:justify;”>com.atguigu.XxxAnnotation</p></td><td style=“vertical-align:top;width:292.25pt;”><p style=“margin-left:.0001pt;text-align:justify;”>過濾所有標注了XxxAnnotation的類。這個規則根據目標組件是否標注了指定類型的注解進行過濾。</p></td></tr><tr><td style=“vertical-align:top;width:66.65pt;”><p style=“margin-left:.0001pt;text-align:justify;”>assignable</p></td><td style=“vertical-align:top;width:128.6pt;”><p style=“margin-left:.0001pt;text-align:justify;”>com.atguigu.BaseXxx</p></td><td style=“vertical-align:top;width:292.25pt;”><p style=“margin-left:.0001pt;text-align:justify;”>過濾所有BaseXxx類的子類。這個規則根據目標組件是否是指定類型的子類的方式進行過濾。</p></td></tr><tr><td style=“vertical-align:top;width:66.65pt;”><p style=“margin-left:.0001pt;text-align:justify;”>aspectj</p></td><td style=“vertical-align:top;width:128.6pt;”><p style=“margin-left:.0001pt;text-align:justify;”>com.atguigu.Service+</p></td><td style=“vertical-align:top;width:292.25pt;”><p style=“margin-left:.0001pt;text-align:justify;”>所有類名是以Service結束的,或這樣的類的子類。這個規則根據AspectJ錶達式進行過濾。</p></td></tr><tr><td style=“vertical-align:top;width:66.65pt;”><p style=“margin-left:.0001pt;text-align:justify;”>regex</p></td><td style=“vertical-align:top;width:128.6pt;”><p style=“margin-left:.0001pt;text-align:justify;”>com.atguigu.anno.</p></td><td style=“vertical-align:top;width:292.25pt;”><p style=“margin-left:.0001pt;text-align:justify;”>所有com.atguigu.anno包下的類。這個規則根據正則錶達式匹配到的類名進行過濾。</p></td></tr><tr><td style=“vertical-align:top;width:66.65pt;”><p style=“margin-left:.0001pt;text-align:justify;”>custom</p></td><td style=“vertical-align:top;width:128.6pt;”><p style=“margin-left:.0001pt;text-align:justify;”>com.atguigu.XxxTypeFilter</p></td><td style=“vertical-align:top;width:292.25pt;”><p style=“margin-left:.0001pt;text-align:justify;”>使用XxxTypeFilter類通過編碼的方式自定義過濾規則。該類必須實現org.springframework.core.type.filter.TypeFilter接口</p></td></tr></tbody></table>

最常用的上面兩個,以下三個幾乎不用:

type=“aspectj” ?aspectj錶達式

type=“custom” 定義一個TypeFile,自己寫一個類定義使用哪一個

type=“regex” 利用正則錶達式

****注意有bug:有些小夥伴們在進行注解開發的時候注解和掃描都寫的很完美,可就是不起作用,原因可能是缺少相應特有的一個jar包,在這裏需要導入額外的一個aop包

spring-aop-4.0.0.RELEASE.jar

如何高效提昇Java開發效率—Spring注解開發全套教程,面試必知必會_程序員

到這裏,將組件添加到容器中的操作就算是完成了,

在我們將組件添加成功之後呢,我們可以在組件圖標的右上角看到一個小S的圖標,這個時候就錶示這個組件已經成功的加入到了容器中,

3、實現注解的三步驟


總結一下實現注解的三步驟:

  1. 添加context依賴

    context:component-scan

  2. 為類添加相應的注解

    1. **導入aop包

      ???spring-aop-4.0.0.RELEASE.jar**

      ?

三、組件自動裝配

============

但是這樣就結束了嘛?就這麼輕松了嘛?之前學習的bean的作用域與生命周期這些都沒用了嘛?當然不是!!!更重要的是組件還沒獲取呢!!!

如何高效提昇Java開發效率—Spring注解開發全套教程,面試必知必會_程序員_02

那麼接下來就來和大家講一下使用注解開發的高端操作,讓你知道使用注解是多麼的香!!!

我們平常在使用類的時候,難免會在類中調用其他自定義的類對吧,就比如說,Controller組件中往往需要用到Service組件的實例,Service組件中往往需要用到Repository組件的實例。

那麼如果我們對這些需要實例化的組件一個一個的在類中進行實例化,是不是就顯得太麻煩了呢?哎,聰明機智的程序員們怎麼會沒有想到這一點呢!所以組件的自動裝配就出現了,

如何高效提昇Java開發效率—Spring注解開發全套教程,面試必知必會_後端_03

在spring中我們可以通過注解的形式來對組件進行自動的裝配,那麼到底如何對組件進行裝配的呢?

其實是這樣的,在IOC中指定要掃描的包時, context:component-scan 元素會自動注册一個bean的後置處理器:AutowiredAnnotationBeanPostProcessor的實例。該後置處理器可以自動裝配標記了@Autowired、@Resource或@Inject注解的屬性。

而上面的@Autowired、@Resource或@Inject這三個注解,就是我們在進行組件的自動裝配時最常用的注解,

下面我和大家介紹一下這三種注解的具體使用。

1、@autowired注解


@autowired注解能够根據類型實現自動裝配。無論是構造器、普通字段(即使是非public)、還是一切具有參數的方法都可以應用@Autowired注解

默認情况下,所有使用@Autowired注解的屬性都需要被設置。當Spring找不到匹配的bean裝配屬性時,會拋出异常。

(1)@autowired裝配原理

接下裏我來和大家詳細的講一下@autowired注解的裝配原理:

1、使用自動裝配時,首先會根據類型去容器中查找相應的組件,這就類似於

getBean(“bookService.class”),

2、如果沒有找到就拋异常,如果找到一個就賦值

3、如果找到多個,那麼也是有一定的裝配依據的,並不是隨便找一個進行裝配。

首先根據屬性名作為ID進行繼續尋找,找到對應屬性名的組件就進行裝配,沒有找到就報錯,報錯的原因是:使用變量名作為id進行匹配時候,沒有找到對應的屬性名

(2)@Qualifier指定裝配ID

對於這種報錯其實還有一種解决:就是使用@Qualifier(“bookService”)指定查找ID,找到就裝配,找不到報錯,指定查找ID的代碼示例如下:


// 添加注解錶示自動裝填
@Autowired
@Qualifier("bookdao")
private BookDao bookDao;

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

(3)required—裝配報錯解决

那麼要是每次找不到就報錯,這樣程序不是就崩了嗎?對於這樣的情况應該怎麼辦呢?其實還有一種解决辦法,解决找不到報錯:使用required參數,

@Autowired(required=false) ???required=false錶示如果實在找不到,就裝配null

反正裝配的依據就是,按照多種規則查找合適的裝配對象,直到查找成功,實在不成功就返回null。

(4)特殊屬性的自動裝配

上面是使用@Autowired注解的基本原理與步驟,我們直到spring的注解開發是十分强大的,下面我們再來說幾個特殊的屬性的裝配。

@Autowired注解可以應用在數組類型的屬性上,此時Spring將會把所有匹配的bean進行自動裝配。

@Autowired注解也可以應用在集合屬性上,此時Spring讀取該集合的類型信息,然後自動裝配所有與之兼容的bean。

@Autowired注解用在java.util.Map上時,若該Map的鍵值為String,那麼 Spring將自動裝配與值類型兼容的bean作為值,並以bean的id值作為鍵。

這樣一來,@Autowired注解的自動裝配是不是就顯得十分的强大了,以後媽媽再也不用擔心我new對象了!!!

如何高效提昇Java開發效率—Spring注解開發全套教程,面試必知必會_Java_04

2、@Resource注解


@Resource注解要求提供一個bean名稱的屬性,若該屬性為空,則自動采用標注處的變量或方法名作為bean的名稱。

3、@Inject注解


@Inject和@Autowired注解一樣也是按類型注入匹配的bean,但沒有reqired屬性。

以上就是進行自動裝配時使用的三個注解,在這裏再總結一下,

@autoWried是spring自帶的,更强大一些,能够實現required=false

@Resource也是java自帶的,擴展性更强,所以如果切換成另一個容器框架,@Resource還是可以用的,而@Inject和@Autowired注解一樣也是按類型注入匹配的bean,但沒有reqired屬性。其實在日常開發中,我們最常用到的、功能最强大的注解還是@Autowired注解。所以記住這一個基本上就可以了。

然後再總結一下使用注解的好處,主要就是節省了new對象時麻煩,直接使用一個@Autowired注解,spring就可以自動的為該屬性賦值,一般來說將組件加入到IOC的注解和@Autowired是結合使用的。

四、注解使用的小細節

==============

其實在使用注解進行開發時還有一些小細節需要注意,我在這裏給大家總結一下。

1、整合多個配置文件


當我們開發時的項目過大的時候,在一個配置文件寫如配置有時候就不能滿足我們的需求,所以Spring允許通過<import>將多個配置文件引入到一個文件中,進行配置文件的集成。這樣在啟動Spring容器時,僅需要指定這個合並好的配置文件就可以。import元素的resource屬性支持Spring的標准的路徑資源,

如下示例,我們有springmvc.xml和spring.xml兩個配置文件,現在我們想要將spring.xml引入到springmvc.xml中,方法是:在springmvc.xml中寫入下面代碼:

最後

小編精心為大家准備了一手資料

如何高效提昇Java開發效率—Spring注解開發全套教程,面試必知必會_Java_05

如何高效提昇Java開發效率—Spring注解開發全套教程,面試必知必會_程序員_06

以上Java高級架構資料、源碼、筆記、視頻。Dubbo、Redis、設計模式、Netty、zookeeper、Spring cloud、分布式、高並發等架構技術

 CodeChina開源項目:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視頻】

【附】架構書籍

  1. BAT面試的20道高頻數據庫問題解析
  2. Java面試寶典
  3. Netty實戰
  4. 算法

如何高效提昇Java開發效率—Spring注解開發全套教程,面試必知必會_後端_07

BATJ面試要點及Java架構師進階資料

如何高效提昇Java開發效率—Spring注解開發全套教程,面試必知必會_後端_08

版权声明:本文为[程序員ioms]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210918033442971J.html