詳細(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)類(lèi)
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)類(lèi)
為什么需要這個(gè)接口?
因?yàn)樵陂_(kāi)發(fā)中,業(yè)務(wù)層可能含有涉及到多步數(shù)據(jù)庫(kù)操作,所以這一步需要開(kāi)啟事務(wù),但是開(kāi)發(fā)中這樣的情況太多了,所以我們需要面向橫切面編程,創(chuàng)建代理代理,在調(diào)用業(yè)務(wù)層方法時(shí),我們利用jdk動(dòng)態(tài)代理的增強(qiáng)功能提供事務(wù)。這樣,事務(wù)代碼只用寫(xiě)一次,但是每次業(yè)務(wù)層方法調(diào)用時(shí),我們都可以使用代理對(duì)象去調(diào)用業(yè)務(wù)層方法來(lái)開(kāi)啟事務(wù)。實(shí)現(xiàn)了代碼復(fù)用。
public class UserHandler implements InvocationHandler { //動(dòng)態(tài)創(chuàng)建目標(biāo)對(duì)象 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; } }
這里我就用輸出語(yǔ)句代表事務(wù)語(yǔ)句。
5、創(chuàng)建表示層Servlet去完成調(diào)用
public class UserSaveServlet { public static void main(String[] args) throws Exception { //需要調(diào)用的目標(biāo)類(lèi) Class c= UserServiceImpl.class; Object obj = c.newInstance(); //獲取該類(lèi)的類(lèi)加載器 ClassLoader loader = obj.getClass().getClassLoader(); //目標(biāo)對(duì)象實(shí)現(xiàn)的接口 Class<?>[] interfaces=obj.getClass().getInterfaces(); //獲取InvocationHandler對(duì)象 InvocationHandler handler=new UserHandler(obj); //創(chuàng)建代理對(duì)象 //將返回值轉(zhuǎn)為接口類(lèi)型 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)文章
Java入門(mén)教程--帶包的類(lèi)如何編譯與運(yùn)行
我們一般都是通過(guò)IDE(如Eclipse、Intellij Idea,STS等)來(lái)開(kāi)發(fā),調(diào)試java項(xiàng)目。在不借助IDE的情況下,如何編譯、運(yùn)行Java程序。打包編譯時(shí),會(huì)自動(dòng)創(chuàng)建包目錄,不需要自己新建包名文件夾。2022-12-12關(guān)于log4j漏洞修復(fù)解決方案及源碼編譯
Log4j?是Apache為Java提供的日志管理工具。他與System.out.println()的作用相似,用來(lái)跟蹤、調(diào)試、維護(hù)程序。這篇文章主要介紹了關(guān)于log4j漏洞修復(fù)解決方案及源碼編譯,需要的朋友可以參考下2021-12-12Nacos1.4.0 Windows10單機(jī)模式啟動(dòng)和集群?jiǎn)?dòng)過(guò)程解析
這篇文章主要介紹了Nacos1.4.0 Windows10單機(jī)模式啟動(dòng)和集群?jiǎn)?dòng),第一次使用nacos,廢話不多說(shuō),記錄下自己?jiǎn)?dòng)Nacos遇到的坑,感興趣的朋友跟隨小編一起看看吧2023-10-10SpringMVC整合kinfe4j及問(wèn)題解決分析
這篇文章主要為大家介紹了SpringMVC整合kinfe4j及問(wèn)題解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09Leetcode常見(jiàn)鏈表問(wèn)題及代碼示例
這篇文章主要介紹了Leetcode常見(jiàn)鏈表問(wèn)題及代碼示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11springboot?vue項(xiàng)目管理前后端實(shí)現(xiàn)編輯功能
這篇文章主要為大家介紹了springboot?vue項(xiàng)目管理前后端實(shí)現(xiàn)編輯功能,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05SpringBoot結(jié)合Ajax實(shí)現(xiàn)登錄頁(yè)面實(shí)例
大家好,本篇文章主要講的是SpringBoot結(jié)合Ajax實(shí)現(xiàn)登錄頁(yè)面實(shí)例,感興趣的同學(xué)趕快來(lái)看一看,對(duì)你有幫助的話記得收藏一下2022-02-02java 通過(guò)cmd 調(diào)用命令啟動(dòng)tomcat的操作
這篇文章主要介紹了java 通過(guò)cmd 調(diào)用命令啟動(dòng)tomcat的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧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)可能就沒(méi)有那么的輕松了,所以本文給大家介紹了SpringBoot獲取http數(shù)據(jù)、打印HTTP參數(shù)的4種方式,需要的朋友可以參考下2024-03-03