欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳細(xì)了解MVC+proxy

 更新時(shí)間:2021年07月09日 15:19:24   作者:程序dunk  
Java有兩種代理方式,一種是靜態(tài)代理,另一種是動(dòng)態(tài)代理。對(duì)于靜態(tài)代理,其實(shí)就是通過(guò)依賴(lài)注入,對(duì)對(duì)象進(jìn)行封裝,不讓外部知道實(shí)現(xiàn)的細(xì)節(jié)。很多 API 就是通過(guò)這種形式來(lái)封裝的

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)行

    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ù)解決方案及源碼編譯

    關(guān)于log4j漏洞修復(fù)解決方案及源碼編譯

    Log4j?是Apache為Java提供的日志管理工具。他與System.out.println()的作用相似,用來(lái)跟蹤、調(diào)試、維護(hù)程序。這篇文章主要介紹了關(guān)于log4j漏洞修復(fù)解決方案及源碼編譯,需要的朋友可以參考下
    2021-12-12
  • Nacos1.4.0 Windows10單機(jī)模式啟動(dòng)和集群?jiǎn)?dòng)過(guò)程解析

    Nacos1.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-10
  • SpringMVC整合kinfe4j及問(wèn)題解決分析

    SpringMVC整合kinfe4j及問(wèn)題解決分析

    這篇文章主要為大家介紹了SpringMVC整合kinfe4j及問(wèn)題解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Leetcode常見(jiàn)鏈表問(wèn)題及代碼示例

    Leetcode常見(jiàn)鏈表問(wèn)題及代碼示例

    這篇文章主要介紹了Leetcode常見(jiàn)鏈表問(wèn)題及代碼示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • springboot?vue項(xiàng)目管理前后端實(shí)現(xiàn)編輯功能

    springboot?vue項(xiàng)目管理前后端實(shí)現(xiàn)編輯功能

    這篇文章主要為大家介紹了springboot?vue項(xiàng)目管理前后端實(shí)現(xiàn)編輯功能,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • SpringBoot結(jié)合Ajax實(shí)現(xiàn)登錄頁(yè)面實(shí)例

    SpringBoot結(jié)合Ajax實(shí)現(xiàn)登錄頁(yè)面實(shí)例

    大家好,本篇文章主要講的是SpringBoot結(jié)合Ajax實(shí)現(xiàn)登錄頁(yè)面實(shí)例,感興趣的同學(xué)趕快來(lái)看一看,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • Java IO流之Properties類(lèi)的使用

    Java IO流之Properties類(lèi)的使用

    這篇文章主要介紹了Java IO流之Properties類(lèi)的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • java 通過(guò)cmd 調(diào)用命令啟動(dòng)tomcat的操作

    java 通過(guò)cmd 調(diào)用命令啟動(dòng)tomcat的操作

    這篇文章主要介紹了java 通過(guò)cmd 調(diào)用命令啟動(dòng)tomcat的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • SpringBoot獲取http數(shù)據(jù)、打印HTTP參數(shù)的4種方式

    SpringBoot獲取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

最新評(píng)論