@Resource與@Autowired註解的區別
@Resource預設按照名稱方式進行bean匹配,@Autowired預設按照型別方式進行bean匹配
常用註解:
@Repository:
用於標註資料訪問元件,即DAO元件。
@Service:
用於標註業務層元件。
@RestController:
用於標註控制層元件(如struts中的action),包含@Controller和@ResponseBody。
@Component:
泛指元件,當元件不好歸類的時候,我們可以使用這個註解進行標註。
@ComponentScan:
元件掃描。個人理解相當於,如果掃描到有@Component @Controller @Service等這些註解的類,則把這些類註冊為bean。
@Configuration:
指出該類是 Bean 配置的資訊源,相當於XML中的,一般加在主類上。
@EnableAutoConfiguration:
讓 Spring Boot 根據應用所宣告的依賴來對 Spring 框架進行自動配置,一般加在主類上。
@RequestParam,@PathParm,@PathVariable和@@RequestBody區別
這四個註解都是用來傳引數的,第一個註解是用在不是rest風格的url上,如user?id=1.
第二和第三用於rest風格,如user/1,最後一個是用於傳遞物件的
@ControllerAdvice + @ExceptionHandler 全域性處理 Controller 層異常
讀取配置檔案
1.設計一個實體類,對應配置檔案中的key
2.在該類的類名上加三個註解:
(1)@component:宣告這是一個元件,注意要在啟動類上加@componentscan
註解,使spring能掃描到這個包
(2)@ConfigurationProperties(prefix="xxx")
(3)@PropertySource("classpath:自定義配置檔案的名稱")
3.使用時將該類@autowire即可
面向切面程式設計之攔截器,過濾器,監聽器
(1)攔截器
應用場景:可以做全域性日誌,記錄使用者登入時間,處理全域性異常
第一步:建立一個類實現HandlerInterceptor介面,重寫介面的方法,在該類上加@Component註解
第二步:在入口類的目錄或者兄弟目錄下建立一個類繼承WebMvcConfigurerAdapter類並重寫addInterceptors方法;在類上加@SpringBootConfiguration
(2)過濾器
應用場景:編碼轉換,日誌記錄,判斷使用者是否登入和是否有相應的許可權,重置session有效期
第一步:新建一個類implements Filter介面,並重寫其中的方法。在這個類上加@WebFilter註解,說明過濾器名字和過濾模式。
第二步:在啟動類上加@componentsan註解
第三步:通過過濾器註冊配置類使用過濾器,配置相關的過濾器(例項化並使用)
(3)監聽器
應用場景:獲取當前線上人數,在系統初始化時做一些工作(例如刪日誌,獲取絕對路徑等)
spring boot實現跨域
在controller類上加@CrossOrigin註解,或者新增過濾器,在header'中加資訊
處理全域性異常
一:@ControllerAdvice + @ExceptionHandler 全域性處理 Controller 層異常,注意只能捕獲comtroller層的異常
二:基於Springboot自身的全域性異常統一處理,主要是實現ErrorController介面或者繼承AbstractErrorController抽象類或者繼承BasicErrorController類
三:基於AOP也可以實現異常的全域性處理
@validated驗證框架的使用
1.引入pom包
2.在bean上新增註解:
@Min,@NotNull等
tips: ID為int型別時,只能判斷min,max等,不能判斷是否前端傳值時,可以讓Id= -1,然後@Min(value = 0,message= "id不能為空")方式判斷,如果不傳則會拋異常
3.寫一個處理全域性異常的方法,此方法需要捕獲MethodArgumentNotValidException 異常,可以在此異常處理類內捕獲引數的異常
4.在controller的引數中加入@validated註解,註解寫在@ResposenBody後面,然後該controller丟擲MethodArgumentNotValidException 異常。
5.分組
需要分組校驗時(如ID欄位更新時需要,新增時不需要,這時就需要分組),在bean的屬性上加的註解中進行分組,例如
@NotNull(groups={Update.class})Update.class是一個介面
String name;
會出現的問題:如果某個屬性沒有加分組,這時不會對這個屬性進行校驗
解決辦法:在Update的介面中繼承自Default類
例如:
public interface Update extends Default {}複製程式碼
分組以後在controller中將@validated改為@validated(Update.class),網上的辦法還需要增加insert.class的介面,這裡繼承了Default類以後其實是不需要寫了
@transactional支援事務
1.在需要事務支援的方法上面加@transactional註解,一般加在service的方法或者service的類上
2.@transactional是基於AOP的動態代理,原理是在執行的mapper上加上代理,如果一個事務執行失敗會丟擲runtimeException,這時代理類會捕獲這個異常並進行回滾
3.可以寫一個自定義異常繼承自runtimeException,在@transactional的方法中丟擲這個異常,在呼叫此方法的類中捕獲自定義異常並處理。
注意:內部類呼叫不會回滾
如果@transactional標註的方法與呼叫方法處於同一個類(即內部類呼叫)時事務是不會起作用的(因為物件不能代理它本身),解決方法就是將他們寫在不同的類中
spring Boot 中使用mybatis註解方式
- 定義mapper的介面
- 在介面上面加兩個註解:@Mapper和@Repository
- 在介面裡面定義sql語句及方法
例如:service層呼叫時,只需要注入此mapper,呼叫mapper.updateClass()即可
@Update("update class set title = #{title}, level = #{level}, type = #{type} where id = #{id} ")
int updateClass(XDClass xdClass);複製程式碼