10、Spring中經常使用註解-分層整理

一、@Controller: 標註展現層組件(Bean),可是目前該功能與 @Component 相同,用來建立處理http請求的對象
   Spring4以後加入的註解,原來在@Controller中返回json須要@ResponseBody來配合,若是直接用@RestController替代@Controller就不須要再配置@ResponseBody,默認
返回json格式
1.1)@RequestMapping
    類定義處: 提供初步的請求映射信息,相對於 WEB 應用的根目錄。方法處: 提供進一步的細分映射信息,相對於類定義處的 URL。
    示列1:
    @Controller
    @RequestMapping("/fourthPage")
    public class FourthPageController extends CommonController {}
    
    示列2:包含.do,當訪問路徑中不包含.do後綴時,會報錯404
    @RequestMapping(value = "/getLogo.do")
    @ResponseBody
    public void getLogo(HttpServletRequest request,HttpServletResponse response) throws IOException {}
    
    示列3:不包含do
    @RequestMapping(value = "/ajax/itemParameter/{partNumber:[\\d]+}_{cateGoryCode}","/ajax/itemPackageDetail/{supplierCode:[\\d]+}/{partNumber:[\\d]+}"})
    public String itemParameter(@RequestParam(value = "callback", required = false) String callback,
                                @PathVariable("partNumber") String partNumber,
                                @PathVariable("cateGoryCode") String cateGoryCode,
                                @RequestParam(value = "channel", required = false) String channel,
                                HttpServletResponse response) {

    分析:
    a. @RequestMapping使用正則表達式
    @RequestMapping(value = "/ajax/itemParameter/{partNumber:[\\d]+}_{cateGoryCode}")
    partNumber:[\\d]+  表示:partNumber的傳值必須是數字,匹配一次或屢次,若果不是
    b. @RequestMapping中的value爲2個請求,表示兩個不一樣的請求共用該一個方法
   
1.2)@RequestParam
    用於將請求參數區數據映射到功能處理方法的參數上,若是接口傳遞過來的參數名和接收的不一致,能夠能夠用以下的方式進行接收。
    payWay 就是接口傳遞的參數,channel 就是映射 payWay 的參數名
    @RequestMapping(value = "/itemInfo.do")
    @ResponseBody
    public String itemParameter(@RequestParam(value = "payWay", required = false) String channel){
    
    }
    

1.3)@ModelAttribute
    示列1:用在有返回的方法上:
    當ModelAttribute設置了value,方法返回的值會以這個value爲key,以參數接受到的值做爲value,存入到Model中,以下面的方法執行以後,最終至關於 model.addAttribute("user_name", name);
    假如 @ModelAttribute沒有自定義value,則至關於model.addAttribute("name", name);

    @ModelAttribute(value="user_name")
    public String itemParameter(@RequestParam(value = "channel", required = false) String name,Model model,HttpServletResponse response) {
        return name;
    }
    示列2:用在沒返回的方法上,須要手動增長model.addAttribute()方法
    @ModelAttribute
    public String itemParameter(@RequestParam(value = "channel", required = false) String name,Model model,HttpServletResponse response) {
        model.addAttribute("name",name);
    }
    示列3:標記在方法的參數上
    會將客戶端傳遞過來的參數按名稱注入到指定對象中,而且會將這個對象自動加入ModelMap中,便於View層使用.
    @RequestMapping(value = {"/ajax/itemPackageDetail/{partNumber:[\\d]+}","/ajax/itemPackageDetail/{supplierCode:[\\d]+}/{partNumber:[\\d]+}"})
    public String queryPackageDetail(@RequestParam(value = "callback", required = false) String callback,
                                     @PathVariable("partNumber") String partNumber,
                                     @ModelAttribute("supplierCode") String supplierCode,
                                     @RequestParam(value = "channel", required = false) String channel,
                                     HttpServletResponse response) {}
                                        
    
1.4)@PathVariable("partNumber")
    經過 @PathVariable 能夠將URL中佔位符參數{partNumber}綁定處處理器類的方法形參中@PathVariable(「partNumber「)
    備註:參看文章 https://mp.weixin.qq.com/s/wImduUsyy0dG0ZawmZab4g

2)@Service:    標註業務層組件(Bean),可是目前該功能與 @Component 相同
    示列:
    @Service("productSearchService")
    @Implement(contract = ProductSearchService.class)
    public class ProductSearchServiceImpl implements ProductSearchService {
        @Autowired
        @Qualifier("jedisClient")
        private JedisClientImpl jedisClient;
        
        @Autowired
        private CategoryBusiness                      categoryBusiness;
        
    }
    

3)@Repository: 標註存儲層組件(Bean)
   import org.springframework.stereotype.Repository;
   爲了讓 Spring 可以掃描類路徑中的類並識別出 @Repository 註解,須要在 XML 配置文件中啓用Bean 的自動掃描功能,這能夠經過<context:component-
   scan/>實現
   
   @Repository 只能標註在 DAO 類上呢?這是由於該註解的做用不僅是將類識別爲Bean,同時它還能將所標註的類中拋出的數據訪問異常封裝爲 Spring
   的數據訪問異常類型。Spring自己提供了一個豐富的而且是與具體的數據訪問技術無關的數據訪問異常結構,用於封裝不一樣的持久層框架拋出的異常,使得異
   常獨立於底層的框架。
   示列:
   @Repository
   public class CmmdtySpecialInfoBusiness {
        @Autowired
        DalClient dalClient;
        
        @Autowired
        @Qualifier("cmmdtyDalClientRead")
        protected DalClient cmmdtyDalClientRead;    
   }
  
4)@Component 是一個泛化的概念,僅僅表示一個組件 (Bean) ,能夠做用在任何層次   
   
5)@Transactional 一般添加在service層
        a.所謂事務是指一組邏輯操做單元即一組sql語句。當這個單元中的一部分操做失敗,整個事務回滾,只有所有正確才完成提交。判斷事務是否配置成功
    的關鍵點在於出現異常時事務是否會回滾。
        b.若是咱們的事務註解@Transactional加在dao層,那麼只要與數據庫作增刪改,就要提交一次事務,如此作事務的特性就發揮不出來,尤爲是事務的
    一致性,當出現併發問題是,用戶從數據庫查到的數據都會有所誤差。通常的時候,咱們的service層能夠調用多個dao層,咱們只須要在service層加一個事務
    註解@Transactional,這樣咱們就能夠一個事務處理多個請求,事務的特性也會充分的發揮出來。

6)@Qualifier註解
        qualifier的意思是合格者,經過這個標示,代表了哪一個實現類纔是咱們所須要的。當EmployeeService接口有兩個serviceImp類service1 和service2時
    若是使用@Autowired對EmployeeService進行注入時,spring會由於不知道該綁定哪一個實現類而報錯。須要使用@Qualifier進行區分
        示列:
        @Autowired
        @Qualifier("service1")
        EmployeeService employeeService;
    
7)@Autowired和@Resource區別:
        a. @Autowired 是spring提供的註釋,默認按byType注入。byName須要與@Qualifier("對象名")連用
        用來裝配bean,能夠寫在字段上,或者方法上。默認狀況下必需要求依賴對象必須存在,若是要容許null值,能夠設置它的required屬性爲false,
        例如:@Autowired(required=false)

        b. @Resource 是JAVA2EE提供的,同時支持byType和byName注入,默認按byName注入,若是默認狀況下找不到就按類型找(name屬性解析爲bean的名字,
        而type屬性則解析爲bean的類型,若是既不指定name也不指定type屬性,這時將經過反射機制使用byName自動注入策略)
    推薦使用:@Resource註解在字段上,這樣就不用寫setter方法了,而且這個註解是屬於J2EE的,減小了與spring的耦合。這樣代碼看起就比較優雅。通常經常使用@Autowired
        示列:
            @Resource(name = "auditOrderSubmitServiceImpl")
            private OrderSubmitService<OrderInfo> auditOrderSubmitServiceImpl;
            
            @Autowired
            private OrderSubmitBusiness orderSubmitBusiness;
            
            public abstract class CommonBusiness {
                /** 用於增長、修改、刪除、合併操做 */
                @Resource
                @Qualifier("dalClient")
                protected DalClient dalClient;
                /** 用於查詢操做 */
                @Resource
                @Qualifier("dalClientRead")
                protected DalClient dalClientRead;
            }
    @Resource裝配順序:
    a.若是同時指定了name和type,則從Spring上下文中找到惟一匹配的bean進行裝配,找不到則拋出異常
    b.若是指定了name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常
    c.若是指定了type,則從上下文中找到類型匹配的惟一bean進行裝配,找不到或者找到多個,都會拋出異常
    d.若是既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;若是沒有匹配,則回退爲一個原始類型進行匹配,若是匹配則自動裝配;
   
8)@Scope 用來配置 spring bean 的做用域,它標識 bean 的做用域。默認值是單例
    a.singleton:單例模式,全局有且僅有一個實例
    b.prototype:原型模式,每次獲取Bean的時候會有一個新的實例
    c.request:request表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP request內有效
    d.session:session做用域表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP session內有效
    e.global session:只在portal應用中有用,給每個 global http session 新建一個Bean實例
    ajax

相關文章
相關標籤/搜索