service层的抽取和dao层的抽取差不多相同,主要不同点是dao实例化的问题,需要在调用时传入,并在BaseServiceImpl接收。
详细的过程说明请参考dao层的抽取。
dao层的抽取:http://blog.youkuaiyun.com/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