1. 程式人生 > >SpringMvc三層架構註解詳解@Controller、@Service和@Repository

SpringMvc三層架構註解詳解@Controller、@Service和@Repository

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;

參考文章:https://www.cnblogs.com/xdp-gacl/p/3495887.html