輕松掌握J(rèn)ava代理模式
和大家一起聊一聊java代理模式
1、靜態(tài)代理
1.1靜態(tài)代理的代理類和和被代理的類都要維護(hù)一個(gè)共同的接口。
public interface IUserDao {
void save();
}
1.2被代理的類,目標(biāo)對(duì)象
public class UserDao implements IUserDao{
@Override
public void save() {
System.out.println("-----已經(jīng)保存數(shù)據(jù)!?。?-----");
}
}
1.3代理對(duì)象
public class UserDaoProxy implements IUserDao{
// 接收保存目標(biāo)對(duì)象
private IUserDao target;
public UserDaoProxy(IUserDao target) {
this.target = target;
}
@Override
public void save() {
System.out.println("開始事務(wù)...");
target.save(); // 執(zhí)行目標(biāo)對(duì)象的方法
System.out.println("提交事務(wù)...");
}
}
1.4測(cè)試類
public class App {
public static void main(String[] args) {
// 目標(biāo)對(duì)象
IUserDao target = new UserDao();
// 代理
IUserDao proxy = new UserDaoProxy(target);
proxy.save(); // 執(zhí)行的是,代理的方法
}
}
2、動(dòng)態(tài)代理
2.1同樣的,動(dòng)態(tài)代理也需要完成一個(gè)接口。(同上)
2.2目標(biāo)對(duì)象也是相同的。
2.3只是在代理對(duì)象上有所不同
public class ProxyFactory {
// 維護(hù)一個(gè)目標(biāo)對(duì)象
private Object target;
public ProxyFactory(Object target){
this.target = target;
}
// 給目標(biāo)對(duì)象,生成代理對(duì)象
public Object getProxyInstance() {
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("開啟事務(wù)");
// 執(zhí)行目標(biāo)對(duì)象方法
Object returnValue = method.invoke(target, args);
System.out.println("提交事務(wù)");
return returnValue;
}
});
}
}
2.4測(cè)試類
public class App {
public static void main(String[] args) {
// 目標(biāo)對(duì)象
IUserDao target = new UserDao();
System.out.println(target.getClass());
// 給目標(biāo)對(duì)象,創(chuàng)建代理對(duì)象
IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
System.out.println(proxy.getClass());
// 執(zhí)行方法 【代理對(duì)象】
proxy.save();
}
}
3、cglib代理
3.1cglib代理不需要完成接口,只需要寫被代理的類和代理類即可,此處被代理類同1.2,所以不再編寫。
3.2代理類有所不同,用到cglib代理模式需要引用spring的核心框架包。
public class ProxyFactory implements MethodInterceptor{
// 維護(hù)目標(biāo)對(duì)象
private Object target;
public ProxyFactory(Object target){
this.target = target;
}
// 給目標(biāo)對(duì)象創(chuàng)建代理對(duì)象
public Object getProxyInstance(){
//1. 工具類
Enhancer en = new Enhancer();
//2. 設(shè)置父類
en.setSuperclass(target.getClass());
//3. 設(shè)置回調(diào)函數(shù)
en.setCallback(this);
//4. 創(chuàng)建子類(代理對(duì)象)
return en.create();
}
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("開始事務(wù).....");
// 執(zhí)行目標(biāo)對(duì)象的方法
Object returnValue = method.invoke(target, args);
System.out.println("提交事務(wù).....");
return returnValue;
}
}
3.3測(cè)試類
public class App {
public static void main(String[] args) {
// 目標(biāo)對(duì)象
UserDao target = new UserDao();
System.out.println(target.getClass());
// 代理對(duì)象
UserDao proxy = (UserDao) new ProxyFactory(target).getProxyInstance();
System.out.println(proxy.getClass());
// 執(zhí)行代理對(duì)象的方法
proxy.save();
}
}
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java代理模式實(shí)例詳解【靜態(tài)代理與動(dòng)態(tài)代理】
- Java代理模式實(shí)例分析
- 23種設(shè)計(jì)模式(7) java代理模式
- Java代理模式詳細(xì)解析
- 輕松掌握J(rèn)ava代理模式
- java代理模式與動(dòng)態(tài)代理模式詳解
- Java基礎(chǔ)之讓你徹底搞懂代理模式
- Java通俗易懂系列設(shè)計(jì)模式之代理模式
- Java線程創(chuàng)建靜態(tài)代理模式代碼實(shí)例
- Java簡(jiǎn)單實(shí)現(xiàn)動(dòng)態(tài)代理模式過程解析
- 淺談JAVA設(shè)計(jì)模式之代理模式
- Java設(shè)計(jì)模式之代理模式詳解
相關(guān)文章
java多線程中執(zhí)行多個(gè)程序的實(shí)例分析
在本篇文章里小編給大家整理的是一篇關(guān)于java多線程中執(zhí)行多個(gè)程序的實(shí)例分析內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。2021-02-02
學(xué)會(huì)CompletableFuture輕松駕馭異步編程
這篇文章主要為大家介紹了CompletableFuture輕松駕馭異步編程教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
談?wù)勎覍?duì)Spring Bean 生命周期的理解
Spring Bean 的生命周期在整個(gè) Spring 中占有很重要的位置,掌握這些可以加深對(duì) Spring 的理解。這篇文章主要介紹了Spring Bean 生命周期,需要的朋友可以參考下2018-03-03
idea推送項(xiàng)目到gitee中的創(chuàng)建方法
這篇文章主要介紹了idea推送項(xiàng)目到gitee中的創(chuàng)建方法,本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
Mybatis基于MapperScan注解的動(dòng)態(tài)代理加載機(jī)制詳解
這篇文章主要介紹了Mybatis基于MapperScan注解的動(dòng)態(tài)代理加載機(jī)制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01
解決Shiro 處理ajax請(qǐng)求攔截登錄超時(shí)的問題
這篇文章主要介紹了解決Shiro 處理ajax請(qǐng)求攔截登錄超時(shí)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Java后端返回PDF預(yù)覽給前端的實(shí)現(xiàn)
前端要預(yù)覽服務(wù)器PDF 可直接將要blob流返回給前端,即可用瀏覽器自帶pdf預(yù)覽功能打開,本文就來介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下2023-09-09
IDEA創(chuàng)建Maven項(xiàng)目一直顯示正在加載的問題及解決
這篇文章主要介紹了IDEA創(chuàng)建Maven項(xiàng)目一直顯示正在加載的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12

