iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0
Modern Web

誤打誤撞學了Spring Boot 還當了後端工程師系列 第 9

Day 09 - Spring Boot 常用註釋(下)

Spring Boot 的註釋是用來告知Spring 框架,底下的程式碼代表的意思,並且可以設定相關參數,用來減少重複的程式碼。

Controller 常用註釋

  1. @Controller : 宣告這是SpringMVC Controller 物件,用於標記控制器層。

  2. @RestController : 作用相當於@ResponseBody 加上@Controller,用於回傳JSON、XML 等資料,但不能回傳HTML 頁面。

  3. @RequestMapping : 標示請求的位址,若用在類別上表示所有回應請求的方法都是以該路徑作為父路徑,而它還有六個重要的參數。

    • value : 指定請求位址。
    • method : 指定請求的類型,如GET、POST、PUT、DELETE 等。
    • consumes : 指定處理請求提交的內容類型(Content-Type)。
    • produces : 指定返回的內容類型,只有當請求頭中的Accept 類型中包含該指定類型才回傳。
    • headers : 指定請求中必須包含某些header 值。
    • params : 指定請求中必須包含某些參數值。
    @Controller
    @RequestMapping(value = "/father")
    public class IndexController {
    	// 請求路徑為"/",請求方法為GET
    	@RequestMapping(value = "/test1", 
                        method = RequestMethod.GET)
    	public String test1() {
    		// 忽略
    	}
    
    	// 請求路徑為"/"或是"/test2",請求方法可為GET 或POST
    	@RequestMapping(value = {"/", "/test2"}, 
                        method = {RequestMethod.GET, RequestMethod.POST})
    	public String test2() {
    		// 忽略
    	}
    
    	// 請求提交內容類型為application/JSON,返回內容類型為application/JSON
    	@RequestMapping(value = "/test3",
                        method = ReuqestMethod.POST,
                        consumes = {"application/JSON"},
                        produces = {"application/JSON"})
    	public String test3() {
    		// 忽略
    	}
    
    	// 指定header 元素值包含content-type=text/plain
    	@RequestMapping(value = "/test4",
                        method = RequestMethod.GET,
                        headers = {"content-type=text/plain"})
    	public String test4() {
    		// 忽略
    	}
    
    	// 指定請求參數值為10,也就是路徑/test5?id=10 才進行處理
    	@RequestMapping(value = "/test5",
                        method = RequestMethod.GET,
                        params = {"id=10"})
    	public String test5() {
    		// 忽略
    	}
    }
    
  4. @RequestBody : 常用來處理application/json、application/xml 等Content-Type 類型的資料,表示HTTP 訊息是JSON/XML 格式,需將其轉化為指定類型參數。

  5. @ResponseBody : 透過適當的HttpMessageConverter 將控制器中方法傳回的物件轉為指定格式(JSON/XML)後,寫入Response 物件的Body 資料區。

  6. @ModelAttribute : 將請求資訊封裝為指定物件。

    @RequestMapping(value = "/test6",
    				method = RequestMethod.GET,
    public String test6(
    				@ModelAttribute Member member) {
    	// 將請求參數封裝為Member 物件
    }
    
  7. @SessionAttribute : 用於注入Session 物件。

    @RequestMapping(value = "/test7",
    				method = RequestMethod.GET,
    public String test7(
    				@SessionAttribute("SESSION_NAME") Member member) {
    	// 將Session 名稱為SESSION_NAME 的Session 物件注入到Member 物件
    }
    
  8. @RequestParam : 將傳入變數的值綁定到與@RequestParam 註釋指定名稱相同的參數上,若變數為非必須可以設定required = false。

    @RequestMapping(value = "/test8",
    				method = RequestMethod.GET,
    public String test8(
    				@RequestParam(value = "param1") String param1, 
    				@RequestParam(value = "param2", required = false) String param2) {
    	// 傳入變數名稱為param1 的值綁定到param1
    	// 傳入變數名稱為param2 的值綁定到param2,但param2 變數可以不存在
    }
    
  9. @PathVariable : 透過URL 中的範本變數{PATH_PARAM} 綁定到與@PathVariable 註釋指定名稱相同的參數上,@RequestMapping 可以定義動態的路徑。

    @RequestMapping(value = "/test9/{PATH_PARAM}",
    				method = RequestMethod.GET,
    public String test9(
    				@PathVariable("PATH_PARAM") String path_param) {
    	// 假設請求路徑為/test9/param,path_param 的值就為param
    }
    

Service 常用註釋

  1. @Service : 宣告這是業務處理類別(實現非介面類別),用於標記業務處理層。

Dao 常用註釋

  1. @Repository : 宣告這是資料庫存取類別(實現非介面類別),用於標記資料存取層。

Bean 相關註釋

  1. @Component : 代表該類別是Spring 管理的,常用在無法使用@Service、@Repository 描述的Spring 管理類別上,相當於通用的註釋。

  2. @ComponentScan : 用來掃描元件,自動發現和裝配一些Bean,根據定義的掃描路徑把符合掃描規則的類別裝配到Spring 容器中,預設會從宣告@ComponentScan 所在類別的套件進行掃描。

  3. @Configuration : 宣告這是設定類別,常與@Bean 配合使用。

  4. @Bean : 宣告該方法的回傳結果是一個由Spring 容器管理的Bean,Bean 名稱可由屬性name 定義,若未定義則預設為方法名稱。

    @Configuration
    public class UserConfig {
    	@Bean(name = "AdminBean")
    	public User admin() {
    		User user = new User();
    		user.setId("1");
    		user.setName("Administrator");
    
    		return user;
    	}
    
    	@Bean(name = "UserBean")
    	public User user() {
    		User user = new User();
    		user.setId("2");
    		user.setName("User");
    
    		return user;
    	}
    }
    
  5. @Resource : 用來裝配Bean,預設按byName 自動注入。

  6. @Autowired : 用來裝配Bean,預設按byType 自動注入。

  7. @Qualifier : 指定Bean 的名稱,和@Autowired 搭配使用,當一個Type 有多個Bean 時,@Autowired 搭配@Qualifier 才能取得正確的Bean。

    // AdminBean 為Bean 的名稱
    @Autowired
    @Qualifier("AdminBean")
    private User admin;
    
  8. @Value : 用於取得設定檔中的值。

    // VALUE_NAME 為設定檔中的名稱
    @Value("${VALUE_NAME}")
    private String value_name;
    

例外處理相關註釋

  1. @ControllerAdvice : 與@RestControllerAdvice 相同,用於對例外統一處理,預設對所有Controller 生效,也可按照註釋、套件名稱或是類型限定生效範圍。
  2. @ExceptionHandler : 用在方法上,表示遇到這個例外就執行該方法。
// 限定註釋為RestController 生效
// @ControllerAdvice(annotations = RestController.class)
// 限定com.example.iThomeIronMan.controller Package 下生效
// @ControllerAdvice("com.example.iThomeIronMan.controller")
// 限定Controller1 與Controller2 生效
// @ControllerAdvice(assignableTypes = {Controller1.class, Controller2.class})
@ControllerAdvice
public class ExceptionHandler {
	// 處理NullPointerException 例外
	@ExceptionHandler(NullPointerException.class)
	public String NullPointerExceptionHandler() {
		// 忽略
	}

	// 處理ArithmeticException 和ArrayIndexOutOfBoundsException 例外
	@ExceptionHandler({ArithmeticException.class, ArrayIndexOutOfBoundsException.class})
	public String NullPointerExceptionHandler() {
		// 忽略
	}
}

排程相關註釋

  1. @EnableScheduling : 啟用排程工作。
  2. @Scheduled : 支援多種類型的排程工作,包含cron、fixedDelay 、fixedRate 等。
// 表示該方法為每天中午12 點執行
@Scheduled(cron = "0 0 12 * * ?")
public void task1() {
	// 忽略
}

// 表示該方法執行完畢後5000ms 再次執行
@Scheduled(fixedDelay = 5000)
public void task2() {
	// 忽略
}

// 表示該方法開始執行後5000ms 再次執行
@Scheduled(fixedRate = 5000)
public void task3() {
	// 忽略	
}

AOP 相關註釋

  1. @Aspect : 用於標記切面類別。
  2. @Pointcut : 標記切入點。
  3. @Before : 在切入點開始處執行。
  4. @After : 在切入點結尾處執行。
  5. @AfterReturning : 在切入點傳回(return)內容後執行,用於對傳回內容進行一些加工處理。
  6. @Around : 在切入點前後執行,並可控制何時執行切入點本身的內容。
  7. @AfterThrowing : 當切入點拋出例外後執行。
// 將當前類別標示為Spring 容器管理的類別
@Component
@Aspect
public class LogAspect {
	@Pointcut("execution(* com.example.iThomeIronMan.controller..*(..))")
	public void pointcut() {
	}

	@Before("pointcut()")
	public void before(JoinPoint joinPoint) {
		// 忽略
	}

	@After("pointcut()")
	public void after(JoinPoint joinPoint) {
		// 忽略
	}

	@AfterReturning(pointcut = "pointcut()", returning = "result")
	public void afterReturning(JoinPoint joinPoint, Object result) {
		// 忽略
	}

	@Around("pointcut()")
	public void around(ProceedingJoinPoint joinPoint) {
		// 忽略
	}

	@AfterThrowing(pointcut = "pointcut()", throwing = "throwable")
	public void afterThrowing(JoinPoint joinPoint, Throwable throwable) {
		// 忽略
	}
}

其他常用註釋

  1. @SpringBootApplication : 用來啟動入口類別Application。
  2. @EnableAutoConfiguration : 用來提供自動設定。
  3. @EnableAsync : 用來開啟非同步註釋功能。
  4. @SpringBootTest : Spring Boot 用於測試的註釋,指定入口類別或測試環境等。
  5. @Test : 標示為測試方法。
  6. @Transactional : 基於動態代理的機制,提供了一種透明的事物管理機制,只要標記在方法上,拋出異常就rollback,沒有發生異常就commit,自動提交事物。
    @Transactional(rollbackFor = Exception.class)
    public void method() {
    	// 忽略
    }
    

參考網站

Spring @Transactional註解淺談
Spring Boot Scheduling Tasks 定時任務排程器及Cron表示式 - IT Skills 波林 Polin WEI - 資訊工作者的技術手札
簡易介紹,使用spring @Scheduled 註解執行定時任務! @ 瑞先生 :: 痞客邦 ::


上一篇
Day 08 - Spring Boot 常用註釋(上)
下一篇
Day 10 - Spring Boot 建立專案
系列文
誤打誤撞學了Spring Boot 還當了後端工程師30

尚未有邦友留言

立即登入留言