最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳細了解MVC+proxy

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

1、創(chuàng)建業(yè)務層UserService接口定義需要完成的功能

/**
 * 創(chuàng)建目標接口,定義目標接口要完成的功能
 */
public interface UserService {
    boolean save(User user);
}

2、創(chuàng)建持久層UserDao接口定義具體的CURD

/**
 * 創(chuàng)建目標接口,定義目標接口要完成的功能
 */
public interface UserService {
    boolean save(User user);
}

3、完成UserService接口和UserDao的實現(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接口的實現(xiàn)類

為什么需要這個接口?

因為在開發(fā)中,業(yè)務層可能含有涉及到多步數(shù)據(jù)庫操作,所以這一步需要開啟事務,但是開發(fā)中這樣的情況太多了,所以我們需要面向橫切面編程,創(chuàng)建代理代理,在調(diào)用業(yè)務層方法時,我們利用jdk動態(tài)代理的增強功能提供事務。這樣,事務代碼只用寫一次,但是每次業(yè)務層方法調(diào)用時,我們都可以使用代理對象去調(diào)用業(yè)務層方法來開啟事務。實現(xiàn)了代碼復用。

public class UserHandler implements InvocationHandler {

    //動態(tài)創(chuàng)建目標對象
    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、創(chuàng)建表示層Servlet去完成調(diào)用

public class UserSaveServlet {
    public static void main(String[] args) throws Exception {
        //需要調(diào)用的目標類
        Class c= UserServiceImpl.class;
        Object obj = c.newInstance();
        //獲取該類的類加載器
        ClassLoader loader = obj.getClass().getClassLoader();
        //目標對象實現(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)文章

最新評論

蚌埠市| 新丰县| 福州市| 吴江市| 通辽市| 和顺县| 永吉县| 沅江市| 长乐市| 永济市| 理塘县| 桐梓县| 库尔勒市| 如东县| 微博| 额尔古纳市| 金平| 股票| 南溪县| 徐汇区| 巨鹿县| 天等县| 新泰市| 于田县| 大方县| 宜章县| 康马县| 沾化县| 凤山市| 宿迁市| 澜沧| 潢川县| 道真| 衡东县| 建平县| 兴山县| 嘉峪关市| 枝江市| 荔波县| 双城市| 民丰县|