1. 程式人生 > >BaseService --- service層的抽取

BaseService --- service層的抽取

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