SSM框架實戰系列之八_註解

  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接口自動生成代理類,所以可以這樣用。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章