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
會出現報錯

原因是因為@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 的地方可以使用
, 這等于告訴Spring:在找不到比對Bean時也不抛出BeanCreationException 異常。@Autowired(required = false)
-
和@Autowired
結合使用時,自動注入的政策就從 byType 轉變byName 了。@Qualifier
- @Autowired可以對成員變量、方法以及構造函數進行注釋,而 @Qualifier 的标注對象是成員變量、方法入參、構造函數入參。正是由于注釋對象的不同,是以 Spring 不将 @Autowired 和 @Qualifier 統一成一個注釋類。
@Resource
: 按名稱裝配
差別:
- @Resource預設按照名稱方式進行bean比對,@Autowired預設按照類型方式進行bean比對
- @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上給出的這一段注釋
首先,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
如果是增,改,删加上此注解
- 方法的傳回值應該是int,表示更新語句所影響的行數。
- 在調用的地方必須加事務,沒有事務不能正常執行。@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的寫法:
自動生成相關的方法:
常用的注解:
-
: 注在類上,提供類的get、set、equals、hashCode、canEqual、toString方法@Data
-
: 注在類上,提供類的全參構造@AllArgsConstructor
-
: 注在類上,提供類的無參構造@NoArgsConstructor
-
: 注在屬性上,提供 set 方法@Setter
-
: 注在屬性上,提供 get 方法@Getter
-
: 注在類上,提供對應的 equals 和 hashCode 方法@EqualsAndHashCode
-
: 注在類上,提供對應的 Logger 對象,變量名為 log@Log4j/@Slf4j