目錄
一、Common 層(實(shí)體類)
二、Dao / Mapper 層(數(shù)據(jù)訪問層)
三、Service 層(業(yè)務(wù)邏輯層)
四、Controller 層(控制器層)
1、在類上使用的注解
2、在方法上使用的注解
3、在參數(shù)上使用的注解
4、異常處理器
五、Config 層 (配置類)
六、Interceptor 層 (攔截器)
七、Advice 層(切面層)
八、SpringBoot 啟動類上的注解
每一層對應(yīng)每個包,包名中應(yīng)全為小寫。
前提:導(dǎo)入 Lombok 依賴
@Data:生成 get 和 set 方法以及 toString 方法
@Getter:只生成 get 方法,避免對類中的成員變量修改。
@EqualsAndHashCode(callSuper = false):重寫 equals 和 hashCode 方法
@AllArgsConstructor:生成全參的構(gòu)造方法
@NoArgsConstructor:生成無參的構(gòu)建方法
@Builder(access = AccessLevel.MODULE):實(shí)現(xiàn)不可變對象的創(chuàng)建,避免直接使用構(gòu)造函數(shù)初始化各個字段,并提供了一種鏈?zhǔn)秸{(diào)用的方式來設(shè)置對象屬性。
使用方法
以下是 mybtis - plus下的實(shí)體類字段常用注解
@TableId(value = "id", type = IdType.AUTO):標(biāo)識主鍵,可以根據(jù) value 來對應(yīng)表中字段名稱,type 為主鍵的自增
@TableField("PLATFORM_TYPE"):當(dāng)該注解的 value 值與表中的字段名稱一致時,在進(jìn)行 sql 編寫時就不需要再進(jìn)行別名處理了,會自動映射實(shí)體類的屬性名稱。
@TableField(exist = false):標(biāo)識該屬性在對應(yīng)的表中不存在,不會加入到 mybatis - plus 提供的自動生成的 sql 語句中。
以下是對實(shí)體類中存在的日期格式的類型的格式指定
@JsonFormat:將 Java 對象序列化為 JSON 格式時,日期類型字段的格式化方式。
@DateTimeFormat:用于將請求參數(shù)綁定到 Java 對象時,日期類型字段的格式化方式。
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") //后端 --> 前端 @DateTimeFormat(pattern = "yyyy-MM-dd") //前端 -->后端
二、Dao / Mapper 層(數(shù)據(jù)訪問層)
@Repository:將數(shù)據(jù)庫訪問異常翻譯為 Spring 提供的統(tǒng)一的數(shù)據(jù)訪問異常類型,將類加入到 Spring 容器中。
@Mapper :將類加入到 Spring 容器中,告訴 MyBatis 框架對應(yīng)的接口是一個映射器接口,需要動態(tài)生成對應(yīng)的實(shí)現(xiàn)類。
@DS( DBConstants.DATASOURCE_GZZT_MYSQL):對于多數(shù)據(jù)源的項(xiàng)目用來指定數(shù)據(jù)源。
三、Service 層(業(yè)務(wù)邏輯層)
@Service:將類加入到 Spring 容器中。
@Autowired:根據(jù)類型在 Spring 容器中匹配相應(yīng)的Bean。
@Qualifier:如果存在多個匹配的Bean,可以用該注解指定一個來使用,與 @Autowired 連用。
@Resource:通過名稱進(jìn)行自動裝配。
@AutoWired和@Resource注解的區(qū)別如下:
-
注入方式:@Autowired是Spring提供的注解,通過類型進(jìn)行自動裝配;@Resource是JavaEE提供的注解,通過名稱進(jìn)行自動裝配。 -
匹配規(guī)則:@Autowired默認(rèn)按照類型進(jìn)行匹配,如果存在多個匹配的Bean,則可以通過@Qualifier注解指定具體的Bean;@Resource默認(rèn)按照名稱進(jìn)行匹配,如果存在多個匹配的Bean,則會根據(jù)容器的默認(rèn)規(guī)則進(jìn)行選擇。 -
擴(kuò)展性:@Autowired是Spring提供的注解,更加靈活,可以與其他Spring注解配合使用;@Resource是JavaEE提供的注解,不支持與其他注解的配合使用。
總的來說,@Autowired是Spring推薦使用的注解,更加靈活和強(qiáng)大,而@Resource是JavaEE提供的注解,更加符合JavaEE的規(guī)范。在實(shí)際使用中,可以根據(jù)具體的需求選擇合適的注解。
@Value("${effFileNameLocalDirPath}"):一般用來匹配配置文件中的屬性值。
@Transactional:可以添加在類和方法上,用來進(jìn)行事務(wù)管理。
@Slf4j:開啟日志,通過 log.info(),打印日志,在 Lombok 包下。
四、Controller 層(控制器層)
1、在類上使用的注解
@Controller:用于標(biāo)識控制器類,處理請求并返回視圖。
@RestController:用于標(biāo)識控制器類,處理請求并將響應(yīng)結(jié)果轉(zhuǎn)換為 JSON 或 XML 等格式。
@RequestMapping:可以在類級別或方法級別使用,用于指定請求URL的路徑。
@CrossOrigin:開啟跨域。
2、在方法上使用的注解
@RequestMapping:可以在類級別或方法級別使用,用于指定請求URL的路徑。 @GetMapping:簡化的@RequestMapping,符合 RESTful 風(fēng)格,用于處理GET請求,一般是對應(yīng)的查詢業(yè)務(wù)。
@PostMapping:用于處理POST請求,一般對應(yīng)添加業(yè)務(wù),如果頁面?zhèn)鬟f的參數(shù)為一個 JSON 對象,就必須使用 POST 請求,使用 GET 請求會報錯。
@PutMapping:用于處理PUT請求,一般對應(yīng)修改業(yè)務(wù)。
@DeleteMapping:用于處理DELETE請求,一般對應(yīng)刪除業(yè)務(wù)。
@ResponseBody:將方法的返回值封裝為 JSON 對象。
3、在參數(shù)上使用的注解
@GetMapping("one/{productId}")
public ResultData one(@PathVariable Integer productId)
URL:http://localhost:8080/order/one/1
@PathVariable:參數(shù)值對應(yīng)的是 URL 中傳遞的值。
public ResultData params(@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "5") Integer size)
URL:http://localhost:8080/order/all?page=1&size=5
@RequstParam:參數(shù)值對應(yīng)的時 URL 中傳遞的參數(shù)值。
@RequestBody:將前端傳遞的請求體(JSON 格式)轉(zhuǎn)換為對應(yīng)的 Java 實(shí)體類。
4、異常處理器
@ExceptionHandler:用于處理控制器中出現(xiàn)的異常,可以針對特定的異常類型進(jìn)行處理。
@ControllerAdvice:結(jié)合 @ExceptionHandler 注解在一個類中定義全局異常處理器。
@RestControllerAdvice:將異常處理的結(jié)果封裝為 JSON 格式。
@Component:如果使用自定義的異常處理器,使用該注解將該類注入到 spring 容器中。
以下是自定義攔截器的實(shí)現(xiàn):
public class MyHandlerExceptionResolver implements HandlerExceptionResolver { * @param httpServletRequest request對象 * @param httpServletResponse response對象 * @param o 出現(xiàn)異常的Controller對象 public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, ModelAndView modelAndView = new ModelAndView(); if(e instanceof LongException){ modelAndView.setViewName("error"); }else if(e instanceof OrderException){ modelAndView.setViewName("error"); }else if(e instanceof PayException){ modelAndView.setViewName("error"); //2、前端分離項(xiàng)目。通過響應(yīng)流進(jìn)行進(jìn)行響應(yīng) httpServletResponse.getWriter().write(jsonStr);
五、Config 層 (配置類)
@Configuration:用于標(biāo)識一個類為配置類,配置類中可以定義 Bean 的創(chuàng)建和依賴關(guān)系。
@Bean:用于定義一個 Bean 的配置信息并注入 Spring 容器中。通常用于 @Configuration 類中的方法上。
六、Interceptor 層 (攔截器)
@component:用于標(biāo)識一個類為Spring容器管理的組件(Bean),可以用于任何類。
攔截器類一般都是通過實(shí)現(xiàn) HandlerInterceptor 接口的三個方法來進(jìn)行請求的攔截。
public class LoginInterceptor implements HandlerInterceptor { //AOP public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception { System.out.println("進(jìn)入到Handler之前執(zhí)行【進(jìn)行攔截操作】"); HttpSession session = request.getSession(); Object loginUser = session.getAttribute("loginUser"); response.sendRedirect(request.getContextPath()+"/pages/login.jsp"); return true; //是否放行 false表示不放行 true放行 public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("進(jìn)入到Handler之后執(zhí)行【進(jìn)行后續(xù)操作】"); public void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("當(dāng)請求成功之后數(shù)據(jù)渲染完成執(zhí)行【資源釋放】");
在完成攔截器的實(shí)現(xiàn)之后還需要將攔截器配置到 Web 的配置類中。
public class MyWebConfig implements WebMvcConfigurer { private LoginInterceptor loginInterceptor; //添加虛擬路徑,相同于通過一個路徑來訪問本地磁盤上的內(nèi)容 public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/image/**") .addResourceLocations("file:D:\\upload\\"); public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") //請求的資源 /**表示所有資源 、 .allowedOrigins("*") //允許指定的源能訪問 .allowedHeaders("*") //允許攜帶的請求頭 .allowedMethods("*"); //允許的請求方式 //注意:當(dāng)設(shè)置允許攜帶Cookie不允許將指定源設(shè)置為所有 public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginInterceptor) //添加攔截器類 .excludePathPatterns("/") //.addPathPatterns("/**") //添加攔截的路徑 .excludePathPatterns("/user/**"); //添加排除路徑
以上就完成了整個攔截器的實(shí)現(xiàn)。
攔截器(Interceptor)和過濾器(filter)之間的區(qū)別如下:
-
觸發(fā)時機(jī):攔截器是在請求處理的前后觸發(fā),可以對請求進(jìn)行預(yù)處理和后處理;而過濾器是在請求到達(dá)Servlet之前或響應(yīng)返回客戶端之前觸發(fā)。 -
對象范圍:攔截器是針對Handler(Controller)級別的,它只能攔截處理器方法的調(diào)用;而過濾器是對Servlet容器級別的,它可以攔截整個請求響應(yīng)鏈。 -
依賴關(guān)系:攔截器依賴于Servlet容器,例如Spring MVC中的DispatcherServlet;而過濾器是獨(dú)立于Servlet容器的,可以在任何符合Servlet規(guī)范的容器中使用。 -
功能定位:攔截器主要用于業(yè)務(wù)邏輯的處理,可以在請求前或請求后進(jìn)行處理、日志記錄、權(quán)限校驗(yàn)等;而過濾器主要用于請求過濾,可以對請求和響應(yīng)進(jìn)行過濾、處理編碼、安全驗(yàn)證等。
七、Advice 層(切面層)
@Aspect:標(biāo)識該類為一個切面類。
@Component:用于掃描指定包下的組件,將其注冊為Spring的Bean。
@PointCut:切入點(diǎn),表示在應(yīng)用程序中可以被攔截到的具體的點(diǎn),比如方法調(diào)用、異常拋出等。
@Before:前置通知。
@After:最終通知。
@AfterRerurning:后置通知。
@AfterThrowing:異常通知。
@Around:環(huán)繞通知。
綜合使用可以通過 Spring 的切面編程在開發(fā)中的使用-CSDN博客 案例實(shí)現(xiàn)。
以下是對五種通知方式的解釋:
完整表示:public void com.service.impl.UserServiceImpl.addUser(); void com.service.impl.UserServiceImpl.addUser(); * com.service.impl.UserServiceImpl.addUser(..); * com.service.*.*Impl.*(..) @Before("execution(* com.service.*.*Impl.*())") System.out.println("前置通知,在目標(biāo)方法執(zhí)行之前就執(zhí)行(相當(dāng)于開啟事務(wù))注解"); @After("execution(* com.service.*.*Impl.*())") System.out.println("最終通知,在目標(biāo)方法執(zhí)行之后執(zhí)行(相當(dāng)于finally 無論異常與否都會返回)注解"); @AfterReturning("execution(* com.service.*.*Impl.*())") public void afterReturning(){ System.out.println("后置通知,在目標(biāo)方法返回返回值之后執(zhí)行(相當(dāng)于關(guān)閉事務(wù))注解"); @AfterThrowing("execution(* com.service.*.*Impl.*())") public void afterThrowing(){ System.out.println("異常通知,在目標(biāo)方法中出現(xiàn)異常是執(zhí)行(相當(dāng)于回滾事務(wù))注解"); @Around("execution(* com.service.*.*Impl.*())") public Object around(ProceedingJoinPoint joinPoint){ System.out.println("前置通知,在目標(biāo)方法執(zhí)行之前就執(zhí)行(相當(dāng)于開啟事務(wù))注解"); //調(diào)用proceed()方法可以繼續(xù)執(zhí)行被增強(qiáng)的方法。 System.out.println("后置通知,在目標(biāo)方法返回返回值之后執(zhí)行(相當(dāng)于關(guān)閉事務(wù))注解"); System.out.println("異常通知,在目標(biāo)方法中出現(xiàn)異常是執(zhí)行(相當(dāng)于回滾事務(wù))注解"); throw new RuntimeException(e); System.out.println("最終通知,在目標(biāo)方法執(zhí)行之后執(zhí)行(相當(dāng)于finally 無論異常與否都會返回)注解");
八、SpringBoot 啟動類上的注解
@SpringBootApplication:用于標(biāo)注主類,表示這是一個Spring Boot應(yīng)用程序的入口類,同時也包含了 @EnableAutoConfiguration 和 @ComponentScan 注解。
@ComponentScan:用于掃描指定包下的組件,將其注冊為Spring的Bean。
@EnableAutoConfiguration:用于自動配置Spring應(yīng)用程序,根據(jù)類路徑下的依賴自動配置Bean。
@MapperScan:指定 MyBatis Mapper 接口所在的包,Spring 在啟動時會掃描指定的包路徑,并注冊這些 Mapper 接口的實(shí)現(xiàn)類作為 Bean。
@EnableScheduling:用于開啟定時任務(wù)的支持。
當(dāng)開啟定時任務(wù)時在對應(yīng)的方法上添加 @Scheduled 注解可以將該方法設(shè)置為一個定時任務(wù)。
@Scheduled(cron = "0 */5 * * * ?"):標(biāo)識該方法為一個定時任務(wù),通過 cron 參數(shù)來指定什么時候執(zhí)行。
關(guān)于@Scheduled的參數(shù)配置可以參考SpringBoot 項(xiàng)目定時任務(wù)的啟動和@Scheduled注解中的cron參數(shù)的設(shè)置原則-CSDN博客
|