- @RequestMapping注解宅此,DispatcherServlet找到控制器并把請求分發(fā)到控制器
類定義處: 表示類中的所有響應(yīng)請求的方法都是以該地址作為父路徑
方法定義處:提供進(jìn)一步的細(xì)分映射信息站削。 相對于類定義處的 URL
如果類上沒有映射外永,那么url直接就是方法的映射兆衅;否則url為類上+方法上映射路徑組合
@Controller
@RequestMapping("user") //類級別毁枯,可以不需要荤胁,如果要了缚甩,下面所有的請求路徑前都需要加入 /user
public class LoginController {
//處理用戶請求
@RequestMapping(value = "/login") //方法級別,必須有弊决,決定這個(gè)方法處理哪個(gè)請求
public String doLogin() {
//此處省略處理邏輯
return "WEB-INF/page/login.jsp";
}
//處理用戶退出登錄請求
@RequestMapping("/logout") //方法級別噪舀,必須有,決定這個(gè)方法處理哪個(gè)請求
public String doLogout() {
//此處省略處理邏輯
return "WEB-INF/page/index.jsp";
}
}
下面這四大注解都是類級別的飘诗,可以不帶任何參數(shù)与倡,也可以帶一個(gè)參數(shù),代表bean名字昆稿,在進(jìn)行注入的時(shí)候就可以通過名字進(jìn)行注入了
- @Controller 注解定義控制器
- @Service 注解定義業(yè)務(wù)處理類
- @Repository 注解定義底層數(shù)據(jù)庫處理接口
- @Component 是通用標(biāo)注纺座,在不清楚使用那個(gè)注解的時(shí)候,可以統(tǒng)統(tǒng)使用Component
當(dāng)在spring中配置了<context:annotation-config/> 和<context:component-scan base-package="*">時(shí)溉潭,上述四種注解的組件都會(huì)由spring容器來創(chuàng)建為bean并由自己來管理.那么創(chuàng)建了上面這些組件后净响,又是如何來注入的呢,這時(shí)就由@autowired來配置了喳瓣。只需要在private的屬性上加上@autowired就可以自動(dòng)把接口屬性的實(shí)現(xiàn)類的bean注入馋贤,注意不需要setter,getter方法
@Service、@Repository注解是放到service或者dao類的實(shí)現(xiàn)類還是接口類中?
答案:要將@Service和@Repository放到實(shí)現(xiàn)類上面而不是接口類上面畏陕,接口只是一個(gè)規(guī)范配乓,需要各種實(shí)現(xiàn)類去實(shí)現(xiàn)這個(gè)接口,我們要用的就是這些實(shí)用類的方法
- @Transactional 注解管理事務(wù)
1.不要在接口上聲明@Transactional 惠毁,而要在具體類的方法上使用 @Transactional 注解犹芹,否則注解可能無效。
2.不要圖省事鞠绰,將@Transactional放置在類級的聲明中腰埂,放在類聲明,會(huì)使得所有方法都有事務(wù)蜈膨。故@Transactional應(yīng)該放在方法級別屿笼,不需要使用事務(wù)的方法荒给,就不要放置事務(wù),比如查詢方法刁卜。否則對性能是有影響的。
3.使用了@Transactional的方法曙咽,對同一個(gè)類里面的方法調(diào)用蛔趴, @Transactional無效。比如有一個(gè)類Test例朱,它的一個(gè)方法A孝情,A再調(diào)用Test本類的方法B(不管B是否public還是private),但A沒有聲明注解事務(wù)洒嗤,而B有箫荡。則外部調(diào)用A之后,B的事務(wù)是不會(huì)起作用的渔隶。(經(jīng)常在這里出錯(cuò))
4.使用了@Transactional的方法羔挡,只能是public,@Transactional注解的方法都是被外部其他類調(diào)用才有效间唉,故只能是public绞灼。道理和上面的有關(guān)聯(lián)。故在 protected呈野、private 或者 package-visible 的方法上使用 @Transactional 注解低矮,它也不會(huì)報(bào)錯(cuò),但事務(wù)無效被冒。