SpringMvc三層架構註解詳解@Controller、@Service和@Repository
阿新 • • 發佈:2019-01-03
springvmc採用經典的三層分層控制結構,在持久層,業務層和控制層分別採用@Repository、@Service、@Controller對分層中的類進行註解,而@Component對那些比較中立的類進行註解
1. @Controller控制層
@Controller用於標記在一個類上,使用它標記的類就是一個SpringMvc Controller物件,分發處理器會掃描使用該註解的類的方法,並檢測該方法是否使用了@RequestMapping註解。@Controller只是定義了一個控制器類,而使用@RequestMapping註解的方法才是處理請求的處理器。
@Controller標記在一個類上還不能真正意義上說它就是SpringMvc的控制器,應為這個時候Spring還不認識它,這個時候需要把這個控制器交給Spring來管理。有兩種方式可以管理:
<!--基於註解的裝配-->
<!--方式一-->
<bean class="com.HelloWorld"/>
<!--方式二-->
<!--路徑寫到controller的上一層-->
<context:component-scan base-package="com"/>
Action層:
package com;
@Controller
public class HelloWorld{
@RequestMapping(value="/showRegUser")
public String printHello () {
return "hello";
}
@Autowried
private IocSerevce service;
public void add(){
service.add();
}
}
component-scan預設掃描的註解型別是@Component,不過,在@Component的語義基礎之上細化為@Reposity,@Service,@Controller.有一個use-defaultbao'i-filters屬性,屬性預設是true,表示會掃描抱下所有的標有@Component的類,並註冊為bean,也就是@Component的子註解@Service,@reposity等
如果只想掃描包下的@Controller或其他內容,則設定use-default-filters屬性為false,表示不再按照scan指定的包進行掃描,而是按照指定包進行掃描
<context:component-scan base-package="com" user-default-filters="false">
<context:include-filter type="regex" expression="com.tan.*"/>
</context:component-scan>
當沒有設定use-default-filters屬性或屬性為true時,表示基於base-package包下指定掃描的具體路徑。
2. @Service()
此注註解屬於業務邏輯層,service或者manager層
預設按照名稱進行裝配,如果名稱可以通過name屬性指定,如果沒有name屬性,註解寫在欄位上時,預設去欄位名進行查詢,如果註解寫在setter方法上,預設按照方法屬性名稱進行裝配。當找不到匹配的bean時,才按照型別進行裝配,如果name名稱一旦指定就會按照名稱進行裝配
Service層:
@Service()
public class IocService{
@Resource
private IIocDao iiocDao;
public void add(){
iiocDao.add();
}
}
3. @Repository持久層
此註解式持久層元件,用於標註資料訪問元件,即DAO元件
DAO層
先定義一個介面
public interface IIocDao{
public void add();
}
然後實現類
//Dao層中定義了一些介面
//表示將Dao類宣告為bean
@Repository
public class IocDao implements IIocDao{
public void add(){
System.out.println("呼叫了Dao");
}
}
另外一種解釋: @Repository對應資料訪問層Bean
@Repository(value="userDao")
public class UserDaoImpl extends BeansDaoImpl<User>{
......
}
@Repository(value=“userDao”)註解告訴Spring ,讓Spring建立一個名字叫做"userDao"的UserDapImpl例項。
當Service需要使用Spring建立的名字叫“userDao”的UserDaoImpl例項時,就可以使用@Resource(name=“userDao”)註解告訴Spring,Spring把建立好的userDao注入給Service即可。
//注入userDao,從資料庫中根據使用者Id取出指定使用者時需要用到
@Resource(name = "userDao")
private BaseDao<User> userDao;