詳細(xì)了解MVC+proxy
1、創(chuàng)建業(yè)務(wù)層UserService接口定義需要完成的功能
/** * 創(chuàng)建目標(biāo)接口,定義目標(biāo)接口要完成的功能 */ public interface UserService { boolean save(User user); }
2、創(chuàng)建持久層UserDao接口定義具體的CURD
/** * 創(chuàng)建目標(biāo)接口,定義目標(biāo)接口要完成的功能 */ public interface UserService { boolean save(User user); }
3、完成UserService接口和UserDao的實(shí)現(xiàn)類
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、創(chuàng)建InvocationHandler接口的實(shí)現(xiàn)類
為什么需要這個(gè)接口?
因?yàn)樵陂_發(fā)中,業(yè)務(wù)層可能含有涉及到多步數(shù)據(jù)庫操作,所以這一步需要開啟事務(wù),但是開發(fā)中這樣的情況太多了,所以我們需要面向橫切面編程,創(chuàng)建代理代理,在調(diào)用業(yè)務(wù)層方法時(shí),我們利用jdk動態(tài)代理的增強(qiáng)功能提供事務(wù)。這樣,事務(wù)代碼只用寫一次,但是每次業(yè)務(wù)層方法調(diào)用時(shí),我們都可以使用代理對象去調(diào)用業(yè)務(wù)層方法來開啟事務(wù)。實(shí)現(xiàn)了代碼復(fù)用。
public class UserHandler implements InvocationHandler { //動態(tài)創(chuàng)建目標(biāo)對象 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; //增強(qiáng)功能 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; } }
這里我就用輸出語句代表事務(wù)語句。
5、創(chuàng)建表示層Servlet去完成調(diào)用
public class UserSaveServlet { public static void main(String[] args) throws Exception { //需要調(diào)用的目標(biāo)類 Class c= UserServiceImpl.class; Object obj = c.newInstance(); //獲取該類的類加載器 ClassLoader loader = obj.getClass().getClassLoader(); //目標(biāo)對象實(shí)現(xiàn)的接口 Class<?>[] interfaces=obj.getClass().getInterfaces(); //獲取InvocationHandler對象 InvocationHandler handler=new UserHandler(obj); //創(chuàng)建代理對象 //將返回值轉(zhuǎn)為接口類型 UserService service=(UserService)Proxy.newProxyInstance(loader,interfaces,handler); boolean success=service.save(new User("張三","123456")); System.out.println(success?"保存成功":"保存失敗"); } }
總結(jié)
本篇文章就到這里了,希望能夠幫助到你,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
關(guān)于log4j漏洞修復(fù)解決方案及源碼編譯
Log4j?是Apache為Java提供的日志管理工具。他與System.out.println()的作用相似,用來跟蹤、調(diào)試、維護(hù)程序。這篇文章主要介紹了關(guān)于log4j漏洞修復(fù)解決方案及源碼編譯,需要的朋友可以參考下2021-12-12Nacos1.4.0 Windows10單機(jī)模式啟動和集群啟動過程解析
這篇文章主要介紹了Nacos1.4.0 Windows10單機(jī)模式啟動和集群啟動,第一次使用nacos,廢話不多說,記錄下自己啟動Nacos遇到的坑,感興趣的朋友跟隨小編一起看看吧2023-10-10springboot?vue項(xiàng)目管理前后端實(shí)現(xiàn)編輯功能
這篇文章主要為大家介紹了springboot?vue項(xiàng)目管理前后端實(shí)現(xiàn)編輯功能,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05SpringBoot結(jié)合Ajax實(shí)現(xiàn)登錄頁面實(shí)例
大家好,本篇文章主要講的是SpringBoot結(jié)合Ajax實(shí)現(xiàn)登錄頁面實(shí)例,感興趣的同學(xué)趕快來看一看,對你有幫助的話記得收藏一下2022-02-02java 通過cmd 調(diào)用命令啟動tomcat的操作
這篇文章主要介紹了java 通過cmd 調(diào)用命令啟動tomcat的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11SpringBoot獲取http數(shù)據(jù)、打印HTTP參數(shù)的4種方式
Java的話本地打斷點(diǎn)可以調(diào)試獲取rest入?yún)?但是在生產(chǎn)環(huán)境可能我們獲取入?yún)ⅲ℉ttp?header/parameter)可能就沒有那么的輕松了,所以本文給大家介紹了SpringBoot獲取http數(shù)據(jù)、打印HTTP參數(shù)的4種方式,需要的朋友可以參考下2024-03-03