關於Spring註解
整理自網上:
Annotation | Package Detail/Import statement |
---|---|
@Service | import org.springframework.stereotype.Service; |
@Repository | import org.springframework.stereotype.Repository; |
@Component | import org.springframework.stereotype.Component; |
@Autowired | import org.springframework.beans.factory.annotation.Autowired; |
@Transactional | import org.springframework.transaction.annotation.Transactional; |
@Scope | import org.springframework.context.annotation.Scope; |
Spring MVC Annotations | |
@Controller | import org.springframework.stereotype.Controller; |
@RequestMapping | import org.springframework.web.bind.annotation.RequestMapping; |
@PathVariable | import org.springframework.web.bind.annotation.PathVariable; |
@RequestParam | import org.springframework.web.bind.annotation.RequestParam; |
@ModelAttribute | import org.springframework.web.bind.annotation.ModelAttribute; |
@SessionAttributes | import org.springframework.web.bind.annotation.SessionAttributes; |
Spring Security Annotations | |
@PreAuthorize | import org.springframework.security.access.prepost.PreAuthorize; |
@Service、@Repository、@Controller、@Component
@Service、@Repository、@Controller、@Component 這四個都是用來註解spring的bean,站在程序的角度它們都是等效。但從名字上,我們很容易看出@Service是註解業務層的bean – Service,@Repository是註解持久層的bean – Dao,@Controller是註解MVC的Controller,@Component 用來註解普通的bean,當這個bean不好歸類的時候,就用@Component。
@Autowired
自動註入值,如下自動註入companyDAO。前提你要保證companyDAO存在spring的context裏。
1 @Servicepublic class CompanyServiceImpl implements CompanyService {@Autowired2
3 private CompanyDAO companyDAO;
4
5 …
6
7 }
@Transactional
添加@Transactional到某個Service類上,說明該Service的所有方法都支持事務管理,若在某個方法上添加@Transactional,只聲明該方法支持事務。當支持事務的方法開始執行前都會先打開一個事務,碰到異常時就會回滾。Spring的默認配置是碰到RunTimeException時才會進行事務回滾。
@Scope
對應<bean scope=”prototype”/>裏的scope,它的值有singleton、prototype、request,session,global session和自定義模式。
@RequestMapping
在類或方法上面使用此註解,設置URL訪問地址。它有兩個屬性,value指定訪問路徑,method指定指定請求方式,請求方式在RequestMethod這個類中,全部以常量形式定義,它默認使用GET請求。它也可以只指定訪問路徑,如下所示
如下{context.path}/comany/addCompany 映射到addCompany方法。
1 @Controller2 @RequestMapping("/company")
3 public class CompanyController {
4 @Autowired
5 private CompanyService companyService;
6 @RequestMapping("/addCompany")
7 public ModelAndView addCompany(Company c){
8 ….
9 }
10 }
@PathVariable
獲取URL訪問路徑變量。在下面的例子裏,訪問路徑是/company/techferry,companyName獲取到的值就是techferry。
1 @Controller2 @RequestMapping("/company")
3 public class CompanyController {
4 @Autowired
5 private CompanyService companyService;
6 @RequestMapping("{companyName}")
7 public String getCompany(Map<String, Object> map, @PathVariable String companyName) {
8 Company company = companyService.findByName(companyName);
9 map.put("company", company);
10 return "company";
11 }
12 ...
13 }
@RequestParam
把URL上的參數綁定到Controller方法上的參數,pageNum的值就是來源於request.getParameter(“pageNum”)。
1 @Controller@RequestMapping(“/company”)public class CompanyController {@Autowired2 private CompanyService companyService;
3
4 @RequestMapping(“/companyList”)
5
6 public String listCompanies(Map<String, Object> map, @RequestParam int pageNum) {
7
8 map.put(“pageNum”, pageNum);
9
10 map.put(“companyList”, companyService.listCompanies(pageNum));
11
12 return “companyList”;
13
14 }
15
16 …
17
18 }
@ModelAttribute
當參數很多的時候,直接定義在方法上,方法的代碼會很長,非常醜陋。通常的做法是定義一個formbean,然後在formbean前使用@ModelAttribute註解。Spring MVC會自動把URL的參數根據匹配的字段名一個一個的設置到formbean裏。
1 @Controller2 @RequestMapping("/company")
3 public class CompanyController {
4 @Autowired
5 private CompanyService companyService;
6 @RequestMapping("/add")
7 public String saveNewCompany(@ModelAttribute Company company) {
8 companyService.add(company);
9 return "redirect:" + company.getName();
10 }
11 ...
12 }
@SessionAttributes
聲明一個變量,存放在session裏,多個請求之間可以共享操作這個變量。
@PreAuthorize
權限驗證
如下例子,只有用戶的role包含“ROLE_ADMIN”才可以刪除Contact。
1 @Transactional
2 @PreAuthorize("hasRole(‘ROLE_ADMIN‘)")
3 public void removeContact(Integer id) {
4 contactDAO.removeContact(id);
5 }
關於Spring註解