BaseService --- service层的抽取

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kyle0349/article/details/51915546

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);//根据用户名查询 保证用户名唯一

}

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);
    }

}

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();// 查看所有

}   

4、创建BaseServiceImpl (实现类)

  注意:
  这里我们需要用到userDao,而在这不能直接实例化userDao,
  所以需要加一个set方法,在调用service层的时候,把userDao传进来 
  用BaseDao接收userDao是没问题的。
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();
    }

}

5、UserService 继承BaseService

 可以把BaseService中有的方法在UserService注释掉(删除)
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);//根据用户名查询 保证用户名唯一

}

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);
    }

}

猜你喜欢

转载自blog.csdn.net/kyle0349/article/details/51915546