詳細瞭解MVC+proxy
1、創建業務層UserService接口定義需要完成的功能
/** * 創建目標接口,定義目標接口要完成的功能 */ public interface UserService { boolean save(User user); }
2、創建持久層UserDao接口定義具體的CURD
/** * 創建目標接口,定義目標接口要完成的功能 */ public interface UserService { boolean save(User user); }
3、完成UserService接口和UserDao的實現類
public class UserServiceImpl implements UserService { private UserDao dao=new UserDaoImpl(); @Override public boolean save(User user) { boolean success=false; success=dao.insert(user); return success; } }
這裡省略具體的JDBC代碼
public class UserDaoImpl implements UserDao { @Override public boolean insert(User user) { System.out.println("insert into t_user (username,password)values('"+user.getUsername()+"','"+user.getPassword()+"')"); return true; } }
4、創建InvocationHandler接口的實現類
為什麼需要這個接口?
因為在開發中,業務層可能含有涉及到多步數據庫操作,所以這一步需要開啟事務,但是開發中這樣的情況太多瞭,所以我們需要面向橫切面編程,創建代理代理,在調用業務層方法時,我們利用jdk動態代理的增強功能提供事務。這樣,事務代碼隻用寫一次,但是每次業務層方法調用時,我們都可以使用代理對象去調用業務層方法來開啟事務。實現瞭代碼復用。
public class UserHandler implements InvocationHandler { //動態創建目標對象 Object target=null; public UserHandler(Object target){ this.target=target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //返回值 Object result=null; //增強功能 System.out.println("begin Transaction....."); result=result=method.invoke(target,args); System.out.println("commit Transaction....."); System.out.println("rollback Transaction....."); System.out.println("end Transaction....."); //返回值 return result; } }
這裡我就用輸出語句代表事務語句。
5、創建表示層Servlet去完成調用
public class UserSaveServlet { public static void main(String[] args) throws Exception { //需要調用的目標類 Class c= UserServiceImpl.class; Object obj = c.newInstance(); //獲取該類的類加載器 ClassLoader loader = obj.getClass().getClassLoader(); //目標對象實現的接口 Class<?>[] interfaces=obj.getClass().getInterfaces(); //獲取InvocationHandler對象 InvocationHandler handler=new UserHandler(obj); //創建代理對象 //將返回值轉為接口類型 UserService service=(UserService)Proxy.newProxyInstance(loader,interfaces,handler); boolean success=service.save(new User("張三","123456")); System.out.println(success?"保存成功":"保存失敗"); } }
總結
本篇文章就到這裡瞭,希望能夠幫助到你,也希望您能夠多多關註WalkonNet的更多內容!
推薦閱讀:
- Java通過動態代理實現一個簡單的攔截器操作
- Spring AOP底層機制之代理模式
- 詳解Java Spring AOP
- 在Java Spring框架中使用的設計模式有哪些
- Spring入門到精通之Bean標簽詳解