一、未使用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();