BaseService --- service層的抽取
阿新 • • 發佈:2019-01-23
service層的抽取和dao層的抽取差不多相同,主要不同點是dao例項化的問題,需要在呼叫時傳入,並在BaseServiceImpl接收。
詳細的過程說明請參考dao層的抽取。
dao層的抽取:http://blog.csdn.net/kyle0349/article/details/51914504
1、抽取前UserService介面
package cn.tax.nsfw.user.service;
import java.io.FileInputStream;
import java.io.Serializable;
import java.util.List;
import cn.tax.nsfw.user.entity.User;
public interface UserService {
public void save(User user);//儲存
public void delete(User user);//刪除使用者
public void update(User user);//更新使用者
public User findById(Serializable id);//根據主鍵查詢使用者
public List<User> getAll();//檢視所有
public List<User> findLike(User user);//模糊查詢
public User findByName(String userName);//根據使用者名稱查詢 保證使用者名稱唯一
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
2、抽取前UserServiceImpl (實現類)
package cn.tax.nsfw.user.service.impl;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import cn.tax.nsfw.user.dao.UserDao;
import cn.tax.nsfw.user.entity.User;
import cn.tax.nsfw.user.service.UserService;
@Service("userService")
public class UserServiceImpl implements UserService {
@Resource
private UserDao userDao;
public void save(User user) {
userDao.save(user);
}
public void delete(User user) {
userDao.delete(user);
}
public void update(User user) {
userDao.update(user);
}
public User findById(Serializable id) {
return userDao.findById(id);
}
public List<User> getAll() {
return userDao.getAll();
}
public List<User> findLike(User user) {
return userDao.findLike(user);
}
public User findByName(String userName) {
return userDao.findByName(userName);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
3、建立BaseService(介面)
package cn.tax.core.service;
import java.io.Serializable;
import java.util.List;
public interface BaseService<T> {
public void save(T entity);// 儲存
public void delete(T entity);// 刪除使用者
public void update(T entity);// 更新使用者
public T findById(Serializable id);// 根據主鍵查詢使用者
public List<T> getAll();// 檢視所有
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
4、建立BaseServiceImpl (實現類)
注意:
這裡我們需要用到userDao,而在這不能直接例項化userDao,
所以需要加一個set方法,在呼叫service層的時候,把userDao傳進來
用BaseDao接收userDao是沒問題的。
- 1
- 2
- 3
- 4
- 5
package cn.tax.core.service.impl;
import java.io.Serializable;
import java.util.List;
import cn.tax.core.dao.BaseDao;
import cn.tax.core.service.BaseService;
public class BaseServiceImpl<T> implements BaseService<T> {
private BaseDao<T> baseDao;
public void setBaseDao(BaseDao<T> baseDao) {
this.baseDao = baseDao;
}
public void save(T entity) {
baseDao.save(entity);
}
public void delete(T entity) {
baseDao.delete(entity);
}
public void update(T entity) {
baseDao.update(entity);
}
public T findById(Serializable id) {
return baseDao.findById(id);
}
public List<T> getAll() {
return baseDao.getAll();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
5、UserService 繼承BaseService
可以把BaseService中有的方法在UserService註釋掉(刪除)
- 1
- 2
package cn.tax.nsfw.user.service;
import java.io.FileInputStream;
import java.io.Serializable;
import java.util.List;
import cn.tax.core.service.BaseService;
import cn.tax.nsfw.user.entity.User;
public interface UserService extends BaseService<User> {
/*public void save(User user);//儲存
public void delete(User user);//刪除使用者
public void update(User user);//更新使用者
public User findById(Serializable id);//根據主鍵查詢使用者
public List<User> getAll();//檢視所有
*/
//以下兩個方法是根據業務需要新增的方法,
//可以看到抽取完BaseService後,service層只剩下新增的業務,比較簡潔
public List<User> findLike(User user);//模糊查詢
public User findByName(String userName);//根據使用者名稱查詢 保證使用者名稱唯一
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
6、UserServiceImpl 繼承BaseServiceImpl
同樣可以把BaseServiceImpl中有的方法在UserServiceImpl中註釋掉(刪除)
注意:
- A、第4點中說到在BaseServiceImpl中需要呼叫userDao,但沒辦法直接例項化,需要呼叫service層時傳進去的問題,那麼就是在這裡傳,在service是通過@Resource拿到IOC容器中userDao的,
B、 @Resource可以放在private UserDao userDao;上面,也可以放在public void
setUserDao(UserDao userDao)上面,
C、我們需要傳userDao到BaseServiceImpl中,通過supper呼叫父類即BaseServiceImpl的setUserDao方法,
D、這樣就把userDao傳進到BaseServiceImpl中,避免空指標異常。
package cn.tax.nsfw.user.service.impl;
import java.io.FileInputStream;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import cn.tax.core.service.impl.BaseServiceImpl;
import cn.tax.nsfw.user.dao.UserDao;
import cn.tax.nsfw.user.entity.User;
import cn.tax.nsfw.user.service.UserService;
@Service("userService")
public class UserServiceImpl extends BaseServiceImpl<User> implements UserService {
private UserDao userDao;
@Resource
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
super.setBaseDao(userDao);
}
/*public void save(User user) {
userDao.save(user);
}
public void delete(User user) {
userDao.delete(user);
}
public void update(User user) {
userDao.update(user);
}
public User findById(Serializable id) {
return userDao.findById(id);
}
public List<User> getAll() {
return userDao.getAll();
}*/
public List<User> findLike(User user) {
return userDao.findLike(user);
}
public User findByName(String userName) {
return userDao.findByName(userName);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41