Spring Boot注解
.常用的注解
@SpringBootApplication 注解的使用
@SpringBootApplication:@SpringBootApplication=@ComponentScan+@Configuration+@EnableAutoConfiguration:約定優(yōu)于配置
@EnableAutoConfiguration 啟用 Spring 應(yīng)用程序上下文的自動配置,試圖猜測和配置您可能需要的bean。自動配置類通常采用基于你的classpath 和已經(jīng)定義的 beans 對象進行應(yīng)用乌妙。被 @EnableAutoConfiguration 注解的類所在的包有特定的意義鼓拧,并且作為默認(rèn)配置使用思犁。通常推薦將 @EnableAutoConfiguration 配置在 root 包下葵腹,這樣所有的子包、類都可以被查找到南捂。
@ComponentScan:注解在類上攒砖,掃描標(biāo)注了@Controller等注解的類缸兔,注冊為bean 。@ComponentScan 為 @Configuration注解的類配置組件掃描指令吹艇。@ComponentScan 注解會自動掃描指定包下的全部標(biāo)有 @Component注解的類惰蜜,并注冊成bean,當(dāng)然包括 @Component下的子注解@Service掐暮、@Repository蝎抽、@Controller。
@RequestMapping 注解的使用
(1)@RequestMapping 和請求報文是做對應(yīng)的
a:value路克,指定請求的地址
b:method 請求方法類型 這個不寫的話樟结,自適應(yīng):get或者post
c:consumes 請求的提交內(nèi)容類型
d:produces 指定返回的內(nèi)容類型 僅當(dāng)request請求頭中的(Accept)類型中包含該指定類型才返回
? e: params 指定request中必須包含某些參數(shù)值;使用 @RequestMapping 來處理請求參數(shù),@RequestMapping 直接的 params 元素可以進一步幫助我們縮小請求映射的定位范圍。使用 params 元素精算,你可以讓多個處理方法處理到同一個URL 的請求, 而這些請求的參數(shù)是不一樣的瓢宦。
f:headers 指定request中必須包含指定的header值 ,使用 @RequestMapping 來處理消息頭,@RequestMapping 注解提供了一個 header 元素來根據(jù)請求中的消息頭內(nèi)容縮小請求映射的范圍。
g: name 指定映射的名稱
@RequestMapping 快捷方式
(2.1)Spring 4.3 引入了方法級注解的變體灰羽,也被叫做 @RequestMapping 的組合注解驮履。組合注解可以更好的表達被注解方法的語義。它們所扮演的角色就是針對 @RequestMapping 的封裝廉嚼,而且成了定義端點的標(biāo)準(zhǔn)方法玫镐。
例:
@RequestMapping(method = RequestMethod.GET)
@RequestMapping(method = RequestMethod.POST)
@RequestMapping(method = RequestMethod.PUT)
@RequestMapping(method = RequestMethod.DELETE)
當(dāng)然也可以使用@GetMapping? ? @PostMapping? @PutMapping? @DeleteMapping 這與上面的是一樣的效果
@RequestMapping 是 Spring Web 應(yīng)用程序中最常用到的注解之一。這個注解會將 HTTP 請求映射到 MVC 和 REST 控制器的處理方法上怠噪。
@RequestMapping 注解可以在控制器類的級別或其中的方法的級別上使用恐似。在類的級別上的注解會將一個特定請求或者請求模式映射到一個控制器之上。之后你還可以另外添加方法級別的注解來進一步指定到處理方法的映射關(guān)系傍念。
@RequestMapping 處理動態(tài) URI
(4.1)@RequestMapping 注解可以同 @PathVaraible 注解一起使用矫夷,用來處理動態(tài)的 URI,URI 的值可以作為控制器中處理方法的參數(shù)憋槐。你也可以使用正則表達式來只處理可以匹配到正則表達式的動態(tài) URI双藕。
(4.2)@PathVariable 同 @RequestParam的運行方式不同。你使用 @PathVariable 是為了從 URI 里取到查詢參數(shù)值阳仔。換言之忧陪,你使用 @RequestParam 是為了從 URI 模板中獲取參數(shù)值。
@RequestParam 注解配合 @RequestMapping 一起使用近范,可以將請求的參數(shù)同處理方法的參數(shù)綁定在一起赤嚼。
(5.1)@RequestParam 注解使用的時候可以有一個值,也可以沒有值顺又。這個值指定了需要被映射到處理方法參數(shù)的請求參數(shù)更卒。例如:
@RequestParam(required = true) String username, //此注解用于規(guī)定請求參數(shù)中必須有username參數(shù)
(5.2)@RequestParam 注解的 required 這個參數(shù)定義了參數(shù)值是否是必須要傳的。例如:
@RequestParam("page") Integer pageCurrent //此注解用于規(guī)定請求參數(shù)必須以page來傳參
@springBootTest 注解進行單元測試
(1)@SpringBootTest 注解描述的類為一個單元測試類
? *? 此類型的對象可以交給Spring容器管理.
@ResponseBody 注解的使用
@responseBody注解的作用是將controller的方法返回的對象通過適當(dāng)?shù)霓D(zhuǎn)換器轉(zhuǎn)換為指定的格式之后稚照,寫入到response對象的body區(qū)蹂空,通常用來返回JSON數(shù)據(jù)或者是XML數(shù)據(jù),
注意:在使用此注解之后不會再走試圖處理器果录,而是直接將數(shù)據(jù)寫入到輸入流中上枕,他的效果等同于通過response對象輸出指定格式的數(shù)據(jù)。
@RequestMapping("/login")
@ResponseBody
public User login(User user){
return user;
}
User字段:userName pwd
那么在前臺接收到的數(shù)據(jù)為:'{"userName":"xxx","pwd":"xxx"}'
效果等同于如下代碼:
@RequestMapping("/login")
public void login(User user, HttpServletResponse response){
response.getWriter.write(JSONObject.fromObject(user).toString());
}
(2)@ResponseBody告訴spring mvc將返回值轉(zhuǎn)換為JSON格式的字符串.
@Component 注解的使用
(1)@Component對類進行描述時表示此類 的對象由spring框架創(chuàng)建,并由spring管理.
@Scope 注解的使用
(1)@Scope用于告訴spring框架此類型的對象存儲到什么作用域中(不同作用域會對應(yīng)不同的存儲方式).
對于非web項目,bean對象的作用域一般只有兩個:
* 1) singleton 表示此類的實例在整個內(nèi)存中只有一份(默認(rèn))
* 2) prototype 表示此類的實例每次請求都會創(chuàng)建一個新的對象.
* 3) request:表示在一次http請求內(nèi)有效(只適用于web應(yīng)用)
* 4)session:表示在一個用戶會話內(nèi)有效(只適用于web應(yīng)用)
* 5)globalSession:表示在全局會話內(nèi)有效(只適用于web應(yīng)用)
注:在多數(shù)情況弱恒,我們只會使用singleton和prototype兩種scope辨萍,如果未指定scope屬性,默認(rèn)為singleton
@PostConStruct與 @ProDestroy 注解的使用
(1)@PostConstruct 注解用于描述對象初始化方法.
? ? ? ? ? 在對象對象初始化時,可以執(zhí)行此方法 。
(2)@PreDestroy 注解用于描述對象銷毀方法
? ? ? ? ? ? 在對象銷毀之前,可以讓容器調(diào)用此方法,以完成資源釋放操作锈玉。
@Mapper 與 @Repository 注解的使用
(1)@Mapper 注解用于修飾數(shù)據(jù)層接口
* 目的是告訴MyBatis框架,此接口的實現(xiàn)類由MyBatis框架創(chuàng)建,并且可以將實現(xiàn)類的對象交給
* Spring容器管理,Spring容器存儲此類對象時,默認(rèn)會將類名(首字母小寫)作為key進行存儲爪飘。
(2)@Repository 注解在類上,表示這是一個數(shù)據(jù)訪問層bean
@Service? @Controller @Componen 注解的使用拉背、
(1)@Service 注解在類上师崎,表示這是一個業(yè)務(wù)層bean
(2)@Controller 注解在類上,表示這是一個控制層bean
(3)@Component: 注解在類上椅棺,表示通用bean犁罩,value不寫默認(rèn)就是類名首字母小寫
@Autowired? @Qualifier @Resource 注解的使用
@Autowired 按類型注入.默認(rèn)屬性required= true;當(dāng)不能確定 Spring 容器中一定擁有某個類的Bean 時, 可以在需要自動注入該類 Bean 的地方可以使用 @Autowired(required = false)两疚, 這等于告訴Spring:在找不到匹配Bean時也不拋出BeanCreationException 異常床估。
@Autowired 和 @Qualifier 結(jié)合使用時,自動注入的策略就從 byType 轉(zhuǎn)變byName 了诱渤。@Autowired可以對成員變量丐巫、方法以及構(gòu)造函數(shù)進行注釋,而 @Qualifier 的標(biāo)注對象是成員變量源哩、方法入?yún)⑿?gòu)造函數(shù)入?yún)ⅰU怯捎谧⑨寣ο蟮牟煌常?Spring 不將 @Autowired 和 @Qualifier 統(tǒng)一成一個注釋類谓着。
@Resource 按名稱裝配
區(qū)別:
4.1)@Resource默認(rèn)按照名稱方式進行bean匹配,@Autowired默認(rèn)按照類型方式進行bean匹配
4.2)@Resource(importjavax.annotation.Resource;)是J2EE的注解坛掠,@Autowired(importorg.springframework.beans.factory.annotation.Autowired;)是Spring的注解
@Configuration @Bean 注解的使用
@Configuration:注解在類上赊锚,表示這是一個IOC容器,相當(dāng)于spring的配置文件屉栓,java配置的方式舷蒲。 IOC容器的配置類一般與 @Bean 注解配合使用,用 @Configuration 注解類等價與 XML 中配置 beans友多,用@Bean 注解方法等價于 XML 中配置 bean牲平。
@Bean: 注解在方法上,聲明當(dāng)前方法返回一個Bean
@RestController @RestControllerAdvice 與 @ExceptionHandler注解的使用
@RestController? 是一個結(jié)合了 @ResponseBody和 @Controller 的注解
@ControllerAdvice? 注解在類域滥,注解描述的類為異常處理類纵柿,此類中可以定義多個異常處理方法 ? @RestControllerAdvice==@ControllerAdvice+@ResponseBody
@ExceptionHandler? 用于描述異常處理方法,注解內(nèi)部的異常類型启绰,為方法能處理的異常類型昂儒。
例:
/@ControllerAdvice
//@ResponseBody
//注解優(yōu)化
@RestControllerAdvice//==@ControllerAdvice+@ResponseBody
public class GlobalExceptionHandler {
/**
* @ExceptionHandler 用于描述異常處理方法,注解內(nèi)部
* 的異常類型委可,為方法能處理的異常類型渊跋。
* @param e
* @return
*/
@ExceptionHandler(RuntimeException.class)
public JsonResult doHandleRuntimeException(
RuntimeException e) {
//輸出異常棧中的信息
e.printStackTrace();
//封裝異常信息
return new JsonResult(e);
}
}? ?
@ConfigurationProperties 注解的使用
@ConfigurationProperties 賦值,將注解轉(zhuǎn)換成對象。給對象賦值拾酝。
@ConfigurationProperties? 注解描述的類可以交給spring容器管理燕少,并且可以從配置文件中讀取配置信息然后賦值給對象屬性(但屬性需要提供set方法)
例:配置文件:application.yml
#PAGE
db:
? page:
? ? pageSize: 20
@Data
@ConfigurationProperties(prefix="db.page")
public class PageProperties{
private Integer pageSize=3;
}
@PathVariable 與 RequestParam注解的使用
@PathVariable 與 @RequestParam? 兩者的作用都是將request里的參數(shù)的值綁定到contorller里的方法參數(shù)里的,區(qū)別在于微宝,URL寫法不同棺亭。當(dāng)請求參數(shù)username不存在時會有異常發(fā)生,可以通過設(shè)置屬性required=false解決,例如:
@RequestParam(value="username",required=false)
使用@RequestParam 時虎眨,URL是這樣的:http://host:post/path?參數(shù)名=參數(shù)值
說明:假如對方法參數(shù)有更高的要求蟋软,例如這個參數(shù)必須有或者這個參數(shù)的值來自和方法參數(shù)不一樣的請求參數(shù)對應(yīng)的值,可以使用@RequestParam注解對參數(shù)進行修飾
public JsonResult doFindPageObjects(
//@RequestParam(required = true) String username, //此注解用于規(guī)定請求參數(shù)中必須有username參數(shù)
String username,
//@RequestParam("page") Integer pageCurrent //此注解用于規(guī)定請求參數(shù)必須以page來傳參
Integer pageCurrent
) {
PageObject<SysLog> pageObject = sysLogService.findPageObjects(username, pageCurrent);
return new JsonResult(pageObject);
}
使用@PathVariable時嗽桩,URL是這樣的:http://host:port/path/參數(shù)值不寫的時候也可以獲取到參數(shù)值岳守,但是必須名稱對應(yīng)。參數(shù)可以省略不寫
說明:@PathVariable注解描述方法參數(shù)時表示這個參數(shù)的值可以取自url中某個變量的值?
例:/**優(yōu)化返回UI界面:
* rest風(fēng)格(軟件架構(gòu)風(fēng)格)的url映射:
? ? *? ? ? 其中:
* 1){ }表示rest表達式碌冶,在這個表達式中用變量的形式表示url
* 2)@PathVariable注解描述方法參數(shù)時表示這個參數(shù)的值可以取自url中某個變量的值? */
@RequestMapping("{module}/{moduleUI}")
public String doModuleUI(@PathVariable String moduleUI) {
return "sys/"+moduleUI;
}
@Param 注解的使用
@Param? 注解單一屬性
dao層示例
@Mapper
public interface SysLogDao {
/**
* 基于條件查詢總記錄數(shù)
* @Param username 查詢條件(例如查詢哪個用戶的日志信息)
* @return 總記錄數(shù)(基于這個結(jié)果可以計算總頁數(shù))
* 說明:假如如下方法沒有使用注解修飾湿痢,在基于名字進行查詢
* 時候會出現(xiàn)There is no getter for property named
* username in class java.lang.String
*/
int getRowCount(@Param("username")String username);
xml映射對應(yīng)示例
<!-- sql元素用于對共性進行提取 -->
<sql id="queryWhereId">
from sys_logs
<where>
<if test="username!=null and username!=''">
username like concat("%",#{username},"%")
</if>
</where>
</sql>
<!--基于條件統(tǒng)計記錄總數(shù) -->
<select id="getRowCount" resultType="int">
select count(*)
<include refid="queryWhereId" />
</select>
注意:采用#{}的方式把@Param注解括號內(nèi)的參數(shù)進行引用(括號內(nèi)參數(shù)對應(yīng)的是形參如 username對應(yīng)的是username..........);
@Param 注解javaBean對象
dao層示例
List<SysLog> findPageObjects(@Param("username")String username,
@Param("startIndex")Integer startIndex,
@Param("pageSize")Integer pageSize);
xml映射對應(yīng)示例
<!-- sql元素用于對共性進行提取 -->
<sql id="queryWhereId">
from sys_logs
<where>
<if test="username!=null and username!=''">
username like concat("%",#{username},"%")
</if>
</where>
</sql>
<select id="findPageObjects"
resultType="com.cy.pj.sys.entity.SysLog">
select *
<include refid="queryWhereId" />
order by createdTime desc
limit #{startIndex},#{pageSize}
</select>
注:在不使用@Param注解的時候扑庞,函數(shù)的參數(shù)只能為一個譬重,并且在查詢語句取值時只能用#{},且其所屬的類必須為Javabean,而使用@Param注解則可以使用多個參數(shù)罐氨,在查詢語句中使用時可以使用#{}或者${}
@cachenamespaceRef 與 @EnablCaching 注解的使用
@CacheNamespaceRef 注解表示此接口中的查詢操作要使用二級緩存臀规,其二級緩存的配置參考name屬性對應(yīng)的命名空間配置
Dao層示例:
@Mapper
//@CacheNamespaceRef(SysMenuDao.class)
@CacheNamespaceRef(name="com.cy.pj.sys.dao.SysMenuDao")
public interface SysMenuDao {
}
xml映射對應(yīng)示例
<mapper namespace="com.cy.pj.sys.dao.SysMenuDao">
<!-- 使用mybatis中二級緩存 eviction:表示算法,配置創(chuàng)建了一個FIFO緩存-->
( LRU –最近最少使用:刪除最長時間未使用的對象栅隐。
FIFO –先進先出:按照對象進入緩存的順序刪除對象塔嬉。
? SOFT –軟引用:根據(jù)垃圾收集器狀態(tài)和軟引用規(guī)則刪除對象。
WEAK –弱引用:根據(jù)垃圾回收器狀態(tài)和弱引用規(guī)則更主動地刪除對象)租悄,
<!--flushInterval:表示該緩存每60秒刷新一次谨究, size:表示最多存儲512個對結(jié)果對象或列表的引用, readOnly:表示返回的對象被視為只讀對象 -->
<cache
eviction="FIFO"?
flushInterval="60000"?
size="512"
readOnly="true" />
(2)@EnablCaching 注解是spring framework中的注解驅(qū)動的緩存管理功能泣棋。自spring版本3.1起加入了該注解胶哲。如果你使用了這個注解,那么你就不需要在XML文件中配置cache manager了潭辈。
@Value @Profile? @suppressWarnings? @Modifying與 @Qurey 注解的使用
@Value:注解在變量上鸯屿,從配置文件中讀取。
例如:@Value(value = “#{message}”)
@Profile:注解在方法類上在不同情況下選擇實例化不同的Bean特定環(huán)境下生效萎胰!
@suppresswarnings 抑制警告
@Modifying 如果是增碾盟,改,刪加上此注解
1:方法的返回值應(yīng)該是int冰肴,表示更新語句所影響的行數(shù)。
2:在調(diào)用的地方必須加事務(wù)熙尉,沒有事務(wù)不能正常執(zhí)行。@Transactional 事務(wù)注解
@Query自定義查詢語句JPQL
2. Lombok 常用注解分析:
(1)@Setter 注解在類或字段
注解在類時為所有字段生成setter方法检痰,注解在字段上時只為該字段生成setter方法。
(2)@Getter 注解在類或字段
注解在類時為所有字段生成getter方法铅歼,注解在字段上時只為該字段生成getter方法。
(3)@ToString 注解在類
添加toString方法椎椰。
(4)@EqualsAndHashCode 注解在類,
生成hashCode和equals方法慨飘。
(5)@NoArgsConstructor 注解在類,
生成無參的構(gòu)造方法瓤的。
(6)@RequiredArgsConstructor 注解在類,
為類中需要特殊處理的字段生成構(gòu)造方法圈膏,比如final和被@NonNull注解的字段。
(7)@AllArgsConstructor 注解在類本辐,
生成包含類中所有字段的構(gòu)造方法桥帆。
(8)@Data 注解在類,
生成setter/getter慎皱、equals老虫、canEqual、hashCode茫多、toString方法祈匙,如為final屬性,則不會為該屬性生成setter方法天揖。
(9)@Slf4j 注解在類夺欲,
生成log變量,嚴(yán)格意義來說是常量今膊。private static final Logger log = LoggerFactory.getLogger(UserController.class);
JPA注解:
注:JPA的注解要么全部都在get上要么全都是屬性上不能混用
(1) @Column:通過@Column注解設(shè)置些阅,包含的設(shè)置如下
name:數(shù)據(jù)庫表字段名
unique:是否唯一
nullable:是否可以為空
Length:長度
inserttable:是否可以插入
updateable:是否可以更新
columnDefinition: 定義建表時創(chuàng)建此列的DDL
secondaryTable: 從表名。如果此列不建在主表上(默認(rèn)建在主表)斑唬,該屬性定義該列所在從表的名字市埋。
@Column(name = "user_code", nullable = false, length=32)//設(shè)置屬性userCode對應(yīng)的字段為user_code黎泣,長度為32,非空
private String userCode;
@Column(name = "user_wages", nullable = true, precision=12,scale=2)//設(shè)置屬性wages對應(yīng)的字段為user_wages缤谎,12位數(shù)字可保留兩位小數(shù)抒倚,可以為空
private double wages;
@Id:表示該屬性為主鍵。
@Temporal 注解
@Temporal(TemporalType.DATE)//設(shè)置為時間類型
private Date joinDate;
@Transient:表示該屬性并非一個到數(shù)據(jù)庫表的字段的映射,ORM框架將忽略該屬性坷澡。如果一個屬性并非數(shù)據(jù)庫表的字段映射,就務(wù)必將其標(biāo)示為@Transient,否則,ORM框架默認(rèn)其注解為@Basic托呕。@Basic(fetch=FetchType.LAZY):標(biāo)記可以指定實體屬性的加載方式
@JsonIgnore:作用是json序列化時將Javabean中的一些屬性忽略掉,序列化和反序列化都受影響。
@JoinColumn(name=”loginId”):一對一:本表中指向另一個表的外鍵频敛。一對多:另一個表指向本表的外鍵项郊。
@OneToOne、@OneToMany姻政、@ManyToOne:對應(yīng)hibernate配置文件中的一對一呆抑,一對多岂嗓,多對一汁展。
@GeneratedValue 用于標(biāo)注主鍵的生成策略,通過 strategy 屬性指定厌殉。
(8.1)默認(rèn)情況下食绿,JPA 自動選擇一個最適合底層數(shù)據(jù)庫的主鍵生成策略:SqlServer 對應(yīng) identity,MySQL 對應(yīng) auto increment公罕。
(8.2)在 javax.persistence.GenerationType 中定義了以下幾種可供選擇的策略:
(2.1)IDENTITY:采用數(shù)據(jù)庫 ID自增長的方式來自增主鍵字段器紧,Oracle 不支持這種方式铲汪;
(2.2)AUTO: JPA自動選擇合適的策略掌腰,是默認(rèn)選項齿梁;
(2.3)SEQUENCE:通過序列產(chǎn)生主鍵肮蛹,通過@SequenceGenerator注解指定序列名伦忠,MySql 不支持這種方式
(2.4)TABLE:通過表產(chǎn)生主鍵昆码,框架借由表模擬序列產(chǎn)生主鍵邓深,使用該策略可以使應(yīng)用更易于數(shù)據(jù)庫移植芥备。? ? ? ?