1. 程式人生 > >關於Spring註解

關於Spring註解

地址 eight 多個 共享 factory wid orm 操作 獲取url

整理自網上:

AnnotationPackage 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 {@Autowired
2
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 @Controller
2 @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 @Controller
2 @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 {@Autowired
2 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 @Controller
2 @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註解