求关于这句话的解释~~
《精通Spring2.x》第八章中的一句话:Spring面向DAO制定了一个通用的异常体系,屏蔽具体持久化技术的异常,是业务层和具体的持久化技术达到解耦。
本人不知道这里怎么就实现解耦了。。。
谢谢!
运行的结果:[code="java"]
添加方法
com.lyx.util.MySqlException: 持久层化异常
at com.lyx.dao.impl.UserDaoImpl.add(UserDaoImpl.java:21)
at com.lyx.services.impl.UserServicesImpl.add(UserServicesImpl.java:20)
at com.lyx.test.TestDemo.main(TestDemo.java:21)
com.lyx.util.MySqlException: 持久层化异常
删除方法
at com.lyx.dao.impl.UserDaoImpl.delete(UserDaoImpl.java:28)
at com.lyx.services.impl.UserServicesImpl.delete(UserServicesImpl.java:25)
at com.lyx.test.TestDemo.main(TestDemo.java:27)
更新方法
Exception in thread "main" com.lyx.util.DaoException: dao层异常信息
at com.lyx.dao.impl.UserDaoImpl.update(UserDaoImpl.java:43)
at com.lyx.services.impl.UserServicesImpl.update(UserServicesImpl.java:31)
at com.lyx.test.TestDemo.main(TestDemo.java:28)
[/code]
原理:
按照 要求 异常应该是由底层往上层逐级抛出的。底层不处理异常 , 让在最终的层处理异常。持久层的异常有业务层处理 。
这样的话 业务层就与持久层的异常产生的耦合。
spring 的方案是在持久层层时 处理处理异常 , 处理的方式 是 在 catch 语句中抛出spring 定义的异常。
看代码:
[code="java"]
package com.lyx.util;
/**
模拟底层的 持久化层的异常。
*/
@SuppressWarnings("serial")
public class MySqlException extends Exception {
public MySqlException(String message) {
super(message);
}
@Override
public String getMessage() {
return super.getMessage();
}
}
/**
/**
2010-4-19
*DaoException.java
*模拟 -- Spring面向DAO制定了一个通用的异常体系,屏蔽具体持久化技术的异常
*/
@SuppressWarnings("serial")
public class DaoException extends RuntimeException {
public DaoException(String message) {
super(message);
}
@Override
public String getMessage() {
return super.getMessage();
}
}
package com.lyx.dao;
import com.lyx.util.MySqlException;
public interface IUserDaoInterface {
public abstract void add() throws MySqlException;
public abstract void delete();
public abstract void update();
}
/**
import com.lyx.dao.IUserDaoInterface;
import com.lyx.util.DaoException;
import com.lyx.util.MySqlException;
/**
2010-4-19
*UserDaoImpl.java
*
*/
public class UserDaoImpl implements IUserDaoInterface {
public void add() throws MySqlException
{
System.out.println("添加方法");
throw new MySqlException("持久层化异常");
}
public void delete()
{
System.out.println("删除方法");
try {
throw new MySqlException("持久层化异常");
} catch (MySqlException e) {
e.printStackTrace();
}
}
public void update()
{
System.out.println("更新方法");
try {
throw new MySqlException("持久层化异常");
} catch (MySqlException e) {
throw new DaoException("dao层异常信息");
}
}
}
package com.lyx.services;
import com.lyx.util.MySqlException;
/**
2010-4-19
*IUserServices.java
*
*/
public interface IUserServices {
public abstract void add() throws MySqlException;
public abstract void delete();
public abstract void update();
}
package com.lyx.services.impl;
import com.lyx.dao.IUserDaoInterface;
import com.lyx.dao.impl.UserDaoImpl;
import com.lyx.services.IUserServices;
import com.lyx.util.MySqlException;
/**
UserServicesImpl.java
*/
public class UserServicesImpl implements IUserServices{
IUserDaoInterface dao=new UserDaoImpl();
@Override
public void add() throws MySqlException {
dao.add();
}
@Override
public void delete() {
dao.delete();
}
@Override
public void update() {
dao.update();
}
}
/**
import com.lyx.services.IUserServices;
import com.lyx.services.impl.UserServicesImpl;
import com.lyx.util.MySqlException;
/**
2010-4-19
*TestDemo.java
*
*/
public class TestDemo {
public static void main(String[] args) {
IUserServices us=new UserServicesImpl();
try {
us.add();
} catch (MySqlException e) {
e.printStackTrace();
}
us.delete();
us.update();
}
}
[/code]