天天看點

@autowired注解作用_SpringBoot常用注解,你用過幾個?

springboot注解:

@Service:

@Service對應的是業務層Bean,例如:

@Service("userService")

注解是告訴Spring,當Spring要建立UserServiceImpl的的執行個體時,bean的名字必須叫做"userService",這樣當Action需要使用UserServiceImpl的的執行個體時,就可以由Spring建立好的"userService",然後注入給Action:在Action隻需要聲明一個名字叫“userService”的變量來接收由Spring注入的"userService"即可,具體代碼如下:

@Controller:

注解在類上,表示這是一個控制層bean

如果直接使用

@Controller

在浏覽器輸入

http://127.0.0.1:8082/hello

會出現報錯

@autowired注解作用_SpringBoot常用注解,你用過幾個?

原因是因為@Controller注解必須配合模闆來使用,也就是@Controller是來響應界面的,如果要使用可以使用Thymeleaf模闆(Spring推薦)。

在pom.xml中加入以下依賴:

在resources->templates目錄下添加hello.html檔案,随便編寫内容再次運作就會正常。

注:Controller層中的【return ”hello“】hello就是頁面的名稱。

@Repository:

@Repository對應資料通路層Bean ,例如:

@Repository(value="userDao")

注解是告訴Spring,讓Spring建立一個名字叫“userDao”的UserDaoImpl執行個體。

當Service需要使用Spring建立的名字叫“userDao”的UserDaoImpl執行個體時,就可以使用

@Resource(name = "userDao")

注解告訴Spring,Spring把建立好的userDao注入給Service即可。

@Component:

注解在類上,表示通用bean ,value不寫預設就是類名首字母小寫

java 中注解,與反射,泛型一樣,同屬元程式設計。而相較于反射作用類對象,泛型活在參數類型化征途,注解簡直不要太自在,這從它的出生(定義), @interface ,便知不能獨立生存,時刻與被注解對象在一起,是一種緊耦合,聲明式程式設計方式。

官方是這樣描述注解的:

上述官話,隻說明了 spring 中 該類注解用途,但沒講明,有些情況下它們為什麼可以互用.

  • 強調一點 ,對于 BeanDefinition 自動掃描檢測和依賴注入,所有這些注解(即 @ Component,@ Service,@ Repository,@ Controller )都是相同的,它們彼此可以互相替換

@Component 的特殊之處在于它是是一個通用的構造型注解,表明該類是一個 spring 元件,

僅在于掃描 @Component 并且不會查找 @Controller , @Service , @Repository 一般而言。掃描它們是因為它們本身都帶有注釋 @Component , 看源碼定義便知

spring 中存在一批注解的注解,類似組合設計,有些注解隻是其他注解的組合(如 RestController = Response+Controller ),有些注解則是配合主注解(如條件注解)
  • @Controller,@Service 并且 @Repository 是特殊類型的 @Component 注解。
  • 選擇它們并将它們的後續類注冊為 bean ,就像它們被注解一樣 @Component 還會掃描特殊類型的注釋,因為它們本身都帶有 @Component 注解的注解
  • 還會掃描特殊類型的注釋,因為它們本身都帶有 @Component 注解的注解

@Autowired:

  • 按類型注入.預設屬性required= true;
  • 當不能确定 Spring 容器中一定擁有某個類的Bean 時, 可以在需要自動注入該類 Bean 的地方可以使用

    @Autowired(required = false)

    , 這等于告訴Spring:在找不到比對Bean時也不抛出BeanCreationException 異常。
  • @Autowired

    @Qualifier

    結合使用時,自動注入的政策就從 byType 轉變byName 了。
  • @Autowired可以對成員變量、方法以及構造函數進行注釋,而 @Qualifier 的标注對象是成員變量、方法入參、構造函數入參。正是由于注釋對象的不同,是以 Spring 不将 @Autowired 和 @Qualifier 統一成一個注釋類。

@Resource

: 按名稱裝配

差別:

  1. @Resource預設按照名稱方式進行bean比對,@Autowired預設按照類型方式進行bean比對
  2. @Resource(importjavax.annotation.Resource;)是J2EE的注解,@Autowired(importorg.springframework.beans.factory.annotation.Autowired;)是Spring的注解

@Configuration:

注解在類上,表示這是一個IOC容器,相當于spring的配置檔案,java配置的方式。 IOC容器的配置類一般與 @Bean 注解配合使用,用 @Configuration 注解類等價與 XML 中配置 beans,用@Bean 注解方法等價于 XML 中配置 bean。

我們先來看看如果不在配置類上添加@Configuration注解會有什麼問題,代碼示例如下:

不添加@Configuration注解運作結果:

添加@Configuration注解運作結果:

在上面的例子中,我們會發現沒有添加@Configuraion注解時wangruiService被建立了兩次, 這是因為第一次建立是被Spring容器所建立的,Spring調用這個wangruiService()建立了一個Bean被放入了單例池中(沒有添加其它配置預設是單例的),第二次建立是Spring容器在建立a時調用了a(),而a()又調用了wangruiService()方法。

這樣的話,就出現問題了。

第一,對于wangruiService而言,它被建立了兩次,單例被打破了

第二,對于a而言,它所依賴的wangruiService不是Spring所管理的,而是直接調用的一個普通的java method建立的普通對象。這個對象不被Spring所管理意味着,首先它的域(Scope)定義失效了,其次它沒有經過一個完整的生命周期,那麼我們所定義所有的Bean的後置處理器都沒有作用到它身上,其中就包括了完成AOP的後置處理器,是以AOP也失效了。

上面的分析不能說服你的話,我們可以看看官方在@Bean上給出的這一段注釋

@autowired注解作用_SpringBoot常用注解,你用過幾個?

首先,Spring就在注釋中指出了,通常來說,BeanMethod一般都申明在一個被@Configuration注解标注的類中,在這種情況下,BeanMethod可能直接引用了在同一個類中申明的beanMethod,就像本文給出的例子那樣,a()直接引用了dmzService(),我們重點再看看劃紅線的部分,通過調用另外一個beanMethod進入的Bean的引用會被保證是遵從域定義以及AOP語義的,就像getBean所做的那樣。這是怎麼實作的呢?在最後被紅線标注的地方也有說明,是通過在運作時期為沒有被@Configuration注解标注的配置類生成一個CGLIB的子類。

@Bean:

注解在方法上,聲明目前方法傳回一個Bean.

Spring的@Bean注解用于告訴方法,産生一個Bean對象,然後這個Bean對象交給Spring管理。産生這個Bean對象的方法Spring隻會調用一次,随後這個Spring将會将這個Bean對象放在自己的IOC容器中。

SpringIOC 容器管理一個或者多個bean,這些bean都需要在@Configuration注解下進行建立,在一個方法上使用@Bean注解就表明這個方法需要交給Spring進行管理。

@Scope:

注解在類上,描述spring容器如何建立Bean執行個體。

(1)singleton: 表示在spring容器中的單例,通過spring容器獲得該bean時總是傳回唯一的執行個體

(2)prototype:表示每次獲得bean都會生成一個新的對象

(3)request:表示在一次http請求内有效(隻适用于web應用)

(4)session:表示在一個使用者會話内有效(隻适用于web應用)

(5)globalSession:表示在全局會話内有效(隻适用于web應用)

在多數情況,我們隻會使用singleton和prototype兩種scope,如果未指定scope屬性,預設為singleton

@Value:注解在變量上,從配置檔案中讀取。

例如:

@Value(value = “#{message}”)

@ConfigurationProperties

有時候有這樣子的情景,我們想把配置檔案的資訊,讀取并自動封裝成實體類,這樣子,我們在代碼裡面使用就輕松友善多了,這時候,我們就可以使用@ConfigurationProperties,它可以把同類的配置資訊自動封裝成實體類

首先在配置檔案裡面,這些資訊是這樣子滴

這時候我們可以定義一個實體類在裝載配置檔案資訊

我們還可以把@ConfigurationProperties還可以直接定義在@bean的注解上,這是bean實體類就不用@Component和@ConfigurationProperties了

然後我們需要使用的時候就直接這樣子注入

@Profile:

注解在方法類上在不同情況下選擇執行個體化不同的Bean特定環境下生效!!!!!!!!!!!!!!!!!

@SpringBootApplication:

@[email protected][email protected][email protected]

:約定優于配置

@EnableAutoConfiguration

啟用 Spring 應用程式上下文的自動配置,試圖猜測和配置您可能需要的bean。自動配置類通常采用基于你的classpath 和已經定義的 beans 對象進行應用。被 @EnableAutoConfiguration 注解的類所在的包有特定的意義,并且作為預設配置使用。通常推薦将 @EnableAutoConfiguration 配置在 root 包下,這樣所有的子包、類都可以被查找到。

@ComponentScan:

注解在類上,掃描标注了@Controller等注解的類,注冊為bean 。@ComponentScan 為 @Configuration注解的類配置元件掃描指令。@ComponentScan 注解會自動掃描指定包下的全部标有 @Component注解的類,并注冊成bean,當然包括 @Component下的子注解@Service、@Repository、@Controller。

@RestController

@RestController 是一個結合了 @ResponseBody 和 @Controller 的注解

@Responsebody 注解表示該方法的傳回的結果直接寫入 HTTP 響應正文(ResponseBody)中,一般在異步擷取資料時使用,通常是在使用 @RequestMapping 後,傳回值通常解析為跳轉路徑,加上@Responsebody 後傳回結果不會被解析為跳轉路徑,而是直接寫入HTTP 響應正文中。

@PathVariable、@RequestParam

兩者的作用都是将request裡的參數的值綁定到contorl裡的方法參數裡的,差別在于,URL寫法不同。

當請求參數username不存在時會有異常發生,可以通過設定屬性required=false解決,例如:

@RequestParam(value="username",required=false)

使用@RequestParam時,URL是這樣的:

http://host:port/path?參數名=參數值

使用@PathVariable時,URL是這樣的:

http://host:port/path/參數值

不寫的時候也可以擷取到參數值,但是必須名稱對應。參數可以省略不寫

@RequestMapping

和請求封包是做對應的

  • value,指定請求的位址
  • method 請求方法類型 這個不寫的話,自适應:get或者post
  • consumes 請求的送出内容類型
  • produces 指定傳回的内容類型 僅當request請求頭中的(Accept)類型中包含該指定類型才傳回
  • params 指定request中必須包含某些參數值
  • headers 指定request中必須包含指定的header值
  • name 指定映射的名稱

@RequestMapping(method = RequestMethod.GET)

@RequestMapping(method = RequestMethod.POST)

@RequestMapping(method = RequestMethod.PUT)

@RequestMapping(method = RequestMethod.DELETE)

當然也可以使用

@GetMapping

@PostMapping

@PutMapping

@DeleteMapping 這與上面的是一樣的效果

@EnablCaching @EnableCaching注解

是spring framework中的注解驅動的緩存管理功能。自spring版本3.1起加入了該注解。如果你使用了這個注解,那麼你就不需要在XML檔案中配置cache manager了。

@suppresswarnings

抑制警告

@Modifying

如果是增,改,删加上此注解

  1. 方法的傳回值應該是int,表示更新語句所影響的行數。
  2. 在調用的地方必須加事務,沒有事務不能正常執行。@Transactional 事務注解

@Query

自定義查詢語句 JPQL

JPA注解

@Entity,@Table(name=“”):

注解在類上表明這是一個實體類。一般用于jpa這兩個注解一般一塊使用,但是如果表名和實體類名相同的話,@Table可以省略

@Column:

通過@Column注解設定,包含的設定如下

  • name:資料庫表字段名
  • unique:是否唯一
  • nullable:是否可以為空
  • Length:長度
  • inserttable:是否可以插入
  • updateable:是否可以更新
  • columnDefinition: 定義建表時建立此列的DDL
  • secondaryTable: 從表名。如果此列不建在主表上(預設建在主表),該屬性定義該列所在從表的名字。

@Id:

表示該屬性為主鍵。

@Transient:

表示該屬性并非一個到資料庫表的字段的映射,ORM架構将忽略該屬性。如果一個屬性并非資料庫表的字段映射,就務必将其标示為@Transient,否則,ORM架構預設其注解為

@Basic

@Basic(fetch=FetchType.LAZY)

:标記可以指定實體屬性的加載方式

@JsonIgnore:

作用是json序列化時将bean中的一些屬性忽略掉,序列化和反序列化都受影響。

@JoinColumn(name=”loginId”):

一對一:本表中指向另一個表的外鍵。一對多:另一個表指向本表的外鍵。

@OneToOne、@OneToMany、@ManyToOne:

對應hibernate配置檔案中的一對一,一對多,多對一。

@GeneratedValue

用于标注主鍵的生成政策,通過 strategy 屬性指定。預設情況下,JPA 自動選擇一個最适合底層資料庫的主鍵生成政策:SqlServer 對應 identity,MySQL 對應 auto increment。 在 javax.persistence.GenerationType 中定義了以下幾種可供選擇的政策:

  • IDENTITY:采用資料庫 ID自增長的方式來自增主鍵字段,Oracle 不支援這種方式;
  • AUTO: JPA自動選擇合适的政策,是預設選項;
  • SEQUENCE:通過序列産生主鍵,通過 @SequenceGenerator 注解指定序列名,MySql 不支援這種方式
  • TABLE:通過表産生主鍵,架構借由表模拟序列産生主鍵,使用該政策可以使應用更易于資料庫移植。

@Data注解 與 lombok

@Data 注解的主要作用是提高代碼的簡潔,使用這個注解可以省去代碼中大量的get()、 set()、 toString()等方法.

要使用 @Data 注解要先引入lombok,lombok 是什麼,它是一個工具類庫,可以用簡單的注解形式來簡化代碼,提高開發效率。

  • 在maven中添加依賴
  • 在編譯器中添加插件 這裡以IDEA為例,在setting的plugin裡搜尋lombok plugin,安裝插件。

使用的話直接在相應的實體類上加上@Data注解即可.

比如一個簡單的Person類,用正常的寫法:

用@Data的寫法:

自動生成相關的方法:

@autowired注解作用_SpringBoot常用注解,你用過幾個?

常用的注解:

  • @Data

    : 注在類上,提供類的get、set、equals、hashCode、canEqual、toString方法
  • @AllArgsConstructor

    : 注在類上,提供類的全參構造
  • @NoArgsConstructor

    : 注在類上,提供類的無參構造
  • @Setter

    : 注在屬性上,提供 set 方法
  • @Getter

    : 注在屬性上,提供 get 方法
  • @EqualsAndHashCode

    : 注在類上,提供對應的 equals 和 hashCode 方法
  • @Log4j/@Slf4j

    : 注在類上,提供對應的 Logger 對象,變量名為 log

繼續閱讀