SSM框架實戰系列之八_註解
使用註解進行開發是非常便利的。以前在使用Spring框架進行開發時,需要在Spring框架的配置文件中定義所有的bean,並設置依賴注入。而現在,在代碼中使用註解便可替代這一做法。
一、基本的註解
以編寫三層結構的應用程序爲例,我們的程序分爲控制器層、業務邏輯層和數據處理層。用戶請求首先到達控制器層,控制器層再調用業務邏輯層,業務邏輯層調用數據處理層。
使用註解進行三層結構的應用程序開發,需要在控制器類加上註解@Controller,業務邏輯類加上註解@Service,數據處理類加上註解@Repository(倉庫)。
只要加上這些註解,由於上一節我們已經設置了Spring框架的組件掃描,因此Spring框架加載時,會查找到帶註解的類,並創建它們的實例。
Spring框架很貼心地爲三層結構應用程序分別規定了不同的註解,以凸顯各層的作用。
二、依賴注入的實現
當一個類中使用另一個類作爲屬性時,只需在屬性定義上加@Resource(資源)註解,即可實現依賴注入。
例如SchoolServiceImpl中使用了SchoolDao作爲其屬性,這時可以這樣寫:
@Service
public class SchoolServiceImpl implements SchoolService {
@Resource
private SchoolDao schoolDao; // 屬性名應規範爲接口名的小寫形式
// 省略部分代碼
}
三、實際案例
下面,以學校管理模塊爲例,展示各部分的代碼,注意觀察註解的使用。
1、項目的目錄結構:
2、bean包中的實體類:
(實體類不需要任何註解,因爲它不需要自動實例化,也沒有依賴注入的要求)
package com.hanhf.ssm.bean;
public class School {
private int id;
private String name;
private Province province;
private String inCharge;
private String city;
private String schoolLevel;
private String remark;
private boolean del;
// 省略getter和setter
}
3、dao包中的數據處理接口(MyBatis不需要編寫實現類,只需編寫接口):
(數據處理類前使用@Repository註解,該類會被自動實例化)
package com.hanhf.ssm.dao;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import com.hanhf.ssm.bean.School;
@Repository
public interface SchoolDao {
void add(School school);
void del(int id);
void update(School school);
School getById(int id);
List<School> list(@Param("name") String name, @Param("provinceId") int provinceId, @Param("city") String city,
@Param("start") int start, @Param("length") int length);
int count(@Param("name") String name, @Param("provinceId") int provinceId, @Param("city") String city);
List<School> listByName(@Param("name") String name);
}
4、service包中的業務處理接口:
(接口中不使用註解,因爲接口不能實例化,所以也就沒有自動實例化和依賴注入的要求)
package com.hanhf.ssm.service;
import java.util.List;
import com.hanhf.ssm.bean.School;
public interface SchoolService {
void add(School school);
void del(int id);
void update(School school);
School get(int id);
List<School> list(String name, int provinceId, String city, int start, int length);
int count(String name, int provinceId, String city);
List<School> listByName(String name);
}
5、service.impl包中的業務處理類:
(業務邏輯類中使用@Service註解,同時注入對DAO的依賴)
package com.hanhf.ssm.service.impl;
import java.util.List;
import javax.annotation.Resource;
import javax.transaction.Transactional;
import org.springframework.stereotype.Service;
import com.hanhf.ssm.bean.School;
import com.hanhf.ssm.dao.SchoolDao;
import com.hanhf.ssm.service.SchoolService;
@Service
@Transactional
public class SchoolServiceImpl implements SchoolService {
@Resource
private SchoolDao schoolDao;
@Override
public void add(School school) {
schoolDao.add(school);
}
@Override
public void del(int id) {
schoolDao.del(id);
}
@Override
public void update(School school) {
schoolDao.update(school);
}
@Override
public School get(int id) {
return schoolDao.getById(id);
}
@Override
public List<School> list(String name, int provinceId, String city, int start, int length) {
return schoolDao.list(name, provinceId, city, start, length);
}
@Override
public int count(String name, int provinceId, String city) {
return schoolDao.count(name, provinceId, city);
}
@Override
public List<School> listByName(String name) {
return schoolDao.listByName(name);
}
}
6、controller包中的控制器類:
(控制器類使用@Controller註解,同時注入對Service的依賴)
package com.hanhf.ssm.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.hanhf.ssm.bean.DatatableData;
import com.hanhf.ssm.bean.Province;
import com.hanhf.ssm.bean.School;
import com.hanhf.ssm.service.ProvinceService;
import com.hanhf.ssm.service.SchoolService;
@Controller
@RequestMapping("/school")
public class SchoolController {
@Resource
private SchoolService schoolService;
@Resource
private ProvinceService provinceService;
@RequestMapping("/toList")
public String toList() {
return "school/list";
}
// 省略部分代碼
}
注意:
註解通常都是加在實現類上的,因爲只有實現類才能創建實例,接口是不能創建實例的。
然而MyBatis的DAO接口是一個特例,可以在DAO接口上加上註解,因爲MyBatis不需要編寫實現類,它會根據DAO接口自動生成代理類,所以可以這樣用。