Spring Boot 的註釋是用來告知Spring 框架,底下的程式碼代表的意思,並且可以設定相關參數,用來減少重複的程式碼。
@Controller
: 宣告這是SpringMVC Controller 物件,用於標記控制器層。@RestController
: 作用相當於@ResponseBody 加上@Controller,用於回傳JSON、XML 等資料,但不能回傳HTML 頁面。@RequestMapping
: 標示請求的位址,若用在類別上表示所有回應請求的方法都是以該路徑作為父路徑,而它還有六個重要的參數。
@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() {
// 忽略
}
}
@RequestBody
: 常用來處理application/json、application/xml 等Content-Type 類型的資料,表示HTTP 訊息是JSON/XML 格式,需將其轉化為指定類型參數。@ResponseBody
: 透過適當的HttpMessageConverter 將控制器中方法傳回的物件轉為指定格式(JSON/XML)後,寫入Response 物件的Body 資料區。@ModelAttribute
: 將請求資訊封裝為指定物件。
@RequestMapping(value = "/test6",
method = RequestMethod.GET,
public String test6(
@ModelAttribute Member member) {
// 將請求參數封裝為Member 物件
}
@SessionAttribute
: 用於注入Session 物件。
@RequestMapping(value = "/test7",
method = RequestMethod.GET,
public String test7(
@SessionAttribute("SESSION_NAME") Member member) {
// 將Session 名稱為SESSION_NAME 的Session 物件注入到Member 物件
}
@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 變數可以不存在
}
@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
: 宣告這是業務處理類別(實現非介面類別),用於標記業務處理層。@Repository
: 宣告這是資料庫存取類別(實現非介面類別),用於標記資料存取層。@Component
: 代表該類別是Spring 管理的,常用在無法使用@Service、@Repository 描述的Spring 管理類別上,相當於通用的註釋。@ComponentScan
: 用來掃描元件,自動發現和裝配一些Bean,根據定義的掃描路徑把符合掃描規則的類別裝配到Spring 容器中,預設會從宣告@ComponentScan 所在類別的套件進行掃描。@Configuration
: 宣告這是設定類別,常與@Bean 配合使用。@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;
}
}
@Resource
: 用來裝配Bean,預設按byName 自動注入。@Autowired
: 用來裝配Bean,預設按byType 自動注入。@Qualifier
: 指定Bean 的名稱,和@Autowired 搭配使用,當一個Type 有多個Bean 時,@Autowired 搭配@Qualifier 才能取得正確的Bean。
// AdminBean 為Bean 的名稱
@Autowired
@Qualifier("AdminBean")
private User admin;
@Value
: 用於取得設定檔中的值。
// VALUE_NAME 為設定檔中的名稱
@Value("${VALUE_NAME}")
private String value_name;
@ControllerAdvice
: 與@RestControllerAdvice 相同,用於對例外統一處理,預設對所有Controller 生效,也可按照註釋、套件名稱或是類型限定生效範圍。@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() {
// 忽略
}
}
@EnableScheduling
: 啟用排程工作。@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() {
// 忽略
}
@Aspec
: 用於標記切面類別。@Pointcut
: 標記切入點。@Before
: 在切入點開始處執行。@After
: 在切入點結尾處執行。@AfterReturning
: 在切入點傳回(return)內容後執行,用於對傳回內容進行一些加工處理。@Around
: 在切入點前後執行,並可控制何時執行切入點本身的內容。@AfterThrowing
: 當切入點拋出例外後執行。// 將當前類別標示為Spring 容器管理的類別
@Component
@Aspec
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) {
// 忽略
}
}
@EnableAsync
: 用來開啟非同步註釋功能。@SpringBootTest
: Spring Boot 用於測試的註釋,指定入口類別或測試環境等。@Test
: 標示為測試方法。@Transactional
: 基於動態代理的機制,提供了一種透明的事物管理機制,只要標記在方法上,拋出異常就rollback,沒有發生異常就commit,自動提交事物。
@Transactional(rollbackFor = Exception.class)
public void method() {
// 忽略
}
Spring @Transactional註解淺談
Spring Boot Scheduling Tasks 定時任務排程器及Cron表示式 - IT Skills 波林 Polin WEI - 資訊工作者的技術手札
簡易介紹,使用spring @Scheduled 註解執行定時任務! @ 瑞先生 :: 痞客邦 ::