一、未使用spring前的麻煩
- 開閉原則:擴充套件是開放的,但是對於修改是“封閉的”。
1、程式碼耦合度比較高【不符合開閉原則】:
public class EmployeeServiceImpl implements IEmployeeService {
private IEmployeeDAO dao;
public EmployeeServiceImpl() {
//建立依賴物件
dao = new EmployeeDAOJdbcImpl();
}
public void save() {
//TODO
}
}
- 此時如果把IEmployeeDAO 的實現類換成 EmployeeDAOMyBatisImpl , 此時需要修改 EmployeeServiceImpl 的原始碼,不符合開閉原則。
2、迴圈依賴問題(使用A類要先建立B類;使用B類要先建立C類;使用C類要先建立A類,迴圈啦。。。)
3、控制事務繁瑣【不符合開閉原則】:
//增刪改查的步驟重複了(開啟資源、開啟事務、提交事務、回滾事務、釋放資源)
public class EmployeeServiceImpl implements IEmployeeService {
public void save() {
//開啟資源
//開啟事務
try {
//儲存操作
//提交事務
} catch (Exception e) {
//回滾事務
} finally {
//釋放資源
}
}
}
■ 模板基類:
- 模板類:作為父類,處理通用演算法功能,把不同的處理細節暴露給子類。
//模板基類:
public class BaseServiceTemplate implements IEmployeeService {
public void save() {
//開啟資源
//開啟事務
try {
this.doSave();
//提交事務
} catch (Exception e) {
//回滾事務
} finally {
//釋放資源
}
}
protected void doSave() {
//NOOP
}
}
//子類
public class EmployeeServiceImpl extends BaseServiceTemplate implements IEmployeeService {
protected void doSave() {
//儲存操作
}
}
■ 使用第三方框架運用太麻煩:
//使用mybatis框架
Person p = new Person();
SqlSession session = MyBatisUtil.getSession();
PersonMapper personMapper = session.getMapper(PersonMapper.class);
personMapper.insert(p);
session.commit();
session.close();