[{"data":1,"prerenderedAt":3891},["ShallowReactive",2],{"\u002Fposts\u002F370adf0":3,"surround-\u002Fposts\u002F370adf0":3885},{"id":4,"title":5,"body":6,"categories":3861,"date":3863,"description":3864,"draft":3865,"extension":3866,"image":3867,"meta":3868,"navigation":98,"path":3870,"permalink":3870,"published":3871,"readingTime":3872,"recommend":122,"references":3871,"seo":3877,"sitemap":3878,"stem":3879,"tags":3880,"type":3883,"updated":3863,"__hash__":3884},"content\u002Fposts\u002F2026\u002FSpring AOP 动态代理机制：从静态代理到 JDK 与 CGLIB 的实现.md","Spring AOP 动态代理机制：从静态代理到 JDK 与 CGLIB 的实现",{"type":7,"value":8,"toc":3850},"minimark",[9,13,16,19,22,26,30,33,36,39,197,200,599,602,866,869,1175,1178,1181,1184,1187,1675,1678,1913,1916,2158,2161,2164,2167,2225,2229,2232,2235,2825,2829,2832,2916,2919,3447,3454,3519,3522,3778,3781,3846],[10,11,12],"p",{},"Spring提供了对面向切面编程(AOP)的丰富支持，允许通过分离应用的业务逻辑与系统级服务（例如审计（auditing）和事务（transaction）管理）进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责（甚至是意识）其它的系统级关注点，例如日志或事务支持。",[10,14,15],{},"Spring 的 AOP 是通过动态代理来实现的。代理是一种设计模式，但是这里说到的静态代理和动态代理不是GoF23种设计模式分类中的一种，而是 Java 领域中按代理类生成时机来划分的实现方式，属于代理模式的具体技术实践，而非 GoF 定义的新分类。",[10,17,18],{},"A (调用方) -> C(代理) -> B(目标)",[10,20,21],{},"调用方不直接调用使用 B，而是通过代理来间接使用 B，这就是代理。",[23,24,25],"h2",{"id":25},"静态代理",[27,28,29],"h3",{"id":29},"耦合日志的代码",[10,31,32],{},"假设我们要实现一个非常简单的登陆功能，用户名是 admin，密码是 123456",[10,34,35],{},"代码如下",[10,37,38],{},"1.首先定义 LoginService 接口",[40,41,47],"pre",{"className":42,"code":43,"filename":44,"language":45,"meta":46,"style":46},"language-java shiki shiki-themes catppuccin-latte one-dark-pro","package top.dhbxs.demo.springaop.staticproxy.service;\n\n\u002F**\n * @author dhbxs\n * @since 2026\u002F4\u002F19\n *\u002F\npublic interface LoginService {\n\n    boolean login(String username, String password);\n}\n","LoginService.java","java","",[48,49,50,93,100,107,120,131,137,153,158,191],"code",{"__ignoreMap":46},[51,52,55,59,62,66,69,71,74,76,79,81,84,86,89],"span",{"class":53,"line":54},"line",1,[51,56,58],{"class":57},"sSWcl","package",[51,60,61],{"class":57}," top",[51,63,65],{"class":64},"sHUla",".",[51,67,68],{"class":57},"dhbxs",[51,70,65],{"class":64},[51,72,73],{"class":57},"demo",[51,75,65],{"class":64},[51,77,78],{"class":57},"springaop",[51,80,65],{"class":64},[51,82,83],{"class":57},"staticproxy",[51,85,65],{"class":64},[51,87,88],{"class":57},"service",[51,90,92],{"class":91},"sgT6j",";\n",[51,94,96],{"class":53,"line":95},2,[51,97,99],{"emptyLinePlaceholder":98},true,"\n",[51,101,103],{"class":53,"line":102},3,[51,104,106],{"class":105},"skYY2","\u002F**\n",[51,108,110,113,117],{"class":53,"line":109},4,[51,111,112],{"class":105}," * ",[51,114,116],{"class":115},"szsGz","@author",[51,118,119],{"class":105}," dhbxs\n",[51,121,123,125,128],{"class":53,"line":122},5,[51,124,112],{"class":105},[51,126,127],{"class":115},"@since",[51,129,130],{"class":105}," 2026\u002F4\u002F19\n",[51,132,134],{"class":53,"line":133},6,[51,135,136],{"class":105}," *\u002F\n",[51,138,140,143,146,150],{"class":53,"line":139},7,[51,141,142],{"class":57},"public",[51,144,145],{"class":57}," interface",[51,147,149],{"class":148},"sIkkJ"," LoginService",[51,151,152],{"class":91}," {\n",[51,154,156],{"class":53,"line":155},8,[51,157,99],{"emptyLinePlaceholder":98},[51,159,161,164,168,171,175,179,182,185,188],{"class":53,"line":160},9,[51,162,163],{"class":57},"    boolean",[51,165,167],{"class":166},"seVD2"," login",[51,169,170],{"class":91},"(",[51,172,174],{"class":173},"sPahJ","String",[51,176,178],{"class":177},"sddMY"," username",[51,180,181],{"class":91},",",[51,183,184],{"class":173}," String",[51,186,187],{"class":177}," password",[51,189,190],{"class":91},");\n",[51,192,194],{"class":53,"line":193},10,[51,195,196],{"class":91},"}\n",[10,198,199],{},"2.实现接口",[40,201,204],{"className":42,"code":202,"filename":203,"language":45,"meta":46,"style":46},"package top.dhbxs.demo.springaop.staticproxy.service.impl;\n\nimport lombok.extern.slf4j.Slf4j;\nimport top.dhbxs.demo.springaop.staticproxy.service.LoginService;\n\n\u002F**\n * @author dhbxs\n * @since 2026\u002F4\u002F19\n *\u002F\n@Slf4j\npublic class LoginServiceImpl implements LoginService {\n\n    @Override\n    public boolean login(String username, String password) {\n        log.info(\"开始登陆\"); \u002F\u002F 日志：非核心业务代码\n        log.info(\"{} 正在登陆系统\", username); \u002F\u002F 日志：非核心业务代码\n        boolean flag = \"admin\".equals(username) && \"123456\".equals(password); \u002F\u002F 核心业务代码\n        if (!flag) {\n            log.error(\"{} 登陆失败\", username); \u002F\u002F 日志：非核心业务代码\n        } else {\n            log.info(\"{} 登陆成功\", username); \u002F\u002F 日志：非核心业务代码\n        }\n        return flag;\n    }\n}\n","LoginServiceImpl.java",[48,205,206,239,243,270,303,307,311,319,327,331,341,359,364,373,401,424,447,496,515,539,550,572,578,588,594],{"__ignoreMap":46},[51,207,208,210,212,214,216,218,220,222,224,226,228,230,232,234,237],{"class":53,"line":54},[51,209,58],{"class":57},[51,211,61],{"class":57},[51,213,65],{"class":64},[51,215,68],{"class":57},[51,217,65],{"class":64},[51,219,73],{"class":57},[51,221,65],{"class":64},[51,223,78],{"class":57},[51,225,65],{"class":64},[51,227,83],{"class":57},[51,229,65],{"class":64},[51,231,88],{"class":57},[51,233,65],{"class":64},[51,235,236],{"class":57},"impl",[51,238,92],{"class":91},[51,240,241],{"class":53,"line":95},[51,242,99],{"emptyLinePlaceholder":98},[51,244,245,248,252,255,258,260,263,265,268],{"class":53,"line":102},[51,246,247],{"class":57},"import",[51,249,251],{"class":250},"szf8G"," lombok",[51,253,65],{"class":254},"sGc2n",[51,256,257],{"class":250},"extern",[51,259,65],{"class":254},[51,261,262],{"class":250},"slf4j",[51,264,65],{"class":254},[51,266,267],{"class":250},"Slf4j",[51,269,92],{"class":91},[51,271,272,274,276,278,280,282,284,286,288,290,292,294,296,298,301],{"class":53,"line":109},[51,273,247],{"class":57},[51,275,61],{"class":250},[51,277,65],{"class":254},[51,279,68],{"class":250},[51,281,65],{"class":254},[51,283,73],{"class":250},[51,285,65],{"class":254},[51,287,78],{"class":250},[51,289,65],{"class":254},[51,291,83],{"class":250},[51,293,65],{"class":254},[51,295,88],{"class":250},[51,297,65],{"class":254},[51,299,300],{"class":250},"LoginService",[51,302,92],{"class":91},[51,304,305],{"class":53,"line":122},[51,306,99],{"emptyLinePlaceholder":98},[51,308,309],{"class":53,"line":133},[51,310,106],{"class":105},[51,312,313,315,317],{"class":53,"line":139},[51,314,112],{"class":105},[51,316,116],{"class":115},[51,318,119],{"class":105},[51,320,321,323,325],{"class":53,"line":155},[51,322,112],{"class":105},[51,324,127],{"class":115},[51,326,130],{"class":105},[51,328,329],{"class":53,"line":160},[51,330,136],{"class":105},[51,332,333,337],{"class":53,"line":193},[51,334,336],{"class":335},"slb6Y","@",[51,338,340],{"class":339},"saiVi","Slf4j\n",[51,342,344,346,349,352,355,357],{"class":53,"line":343},11,[51,345,142],{"class":57},[51,347,348],{"class":57}," class",[51,350,351],{"class":148}," LoginServiceImpl",[51,353,354],{"class":57}," implements",[51,356,149],{"class":148},[51,358,152],{"class":91},[51,360,362],{"class":53,"line":361},12,[51,363,99],{"emptyLinePlaceholder":98},[51,365,367,370],{"class":53,"line":366},13,[51,368,369],{"class":335},"    @",[51,371,372],{"class":339},"Override\n",[51,374,376,379,382,384,386,388,390,392,394,396,399],{"class":53,"line":375},14,[51,377,378],{"class":57},"    public",[51,380,381],{"class":57}," boolean",[51,383,167],{"class":166},[51,385,170],{"class":91},[51,387,174],{"class":173},[51,389,178],{"class":177},[51,391,181],{"class":91},[51,393,184],{"class":173},[51,395,187],{"class":177},[51,397,398],{"class":91},")",[51,400,152],{"class":91},[51,402,404,407,409,412,414,418,421],{"class":53,"line":403},15,[51,405,406],{"class":250},"        log",[51,408,65],{"class":91},[51,410,411],{"class":166},"info",[51,413,170],{"class":91},[51,415,417],{"class":416},"sw_MA","\"开始登陆\"",[51,419,420],{"class":91},");",[51,422,423],{"class":105}," \u002F\u002F 日志：非核心业务代码\n",[51,425,427,429,431,433,435,438,440,443,445],{"class":53,"line":426},16,[51,428,406],{"class":250},[51,430,65],{"class":91},[51,432,411],{"class":166},[51,434,170],{"class":91},[51,436,437],{"class":416},"\"{} 正在登陆系统\"",[51,439,181],{"class":91},[51,441,178],{"class":442},"sa2x1",[51,444,420],{"class":91},[51,446,423],{"class":105},[51,448,450,453,457,461,464,466,469,471,474,476,479,482,484,486,488,491,493],{"class":53,"line":449},17,[51,451,452],{"class":57},"        boolean",[51,454,456],{"class":455},"sIGPt"," flag",[51,458,460],{"class":459},"sqgB4"," =",[51,462,463],{"class":416}," \"admin\"",[51,465,65],{"class":91},[51,467,468],{"class":166},"equals",[51,470,170],{"class":91},[51,472,473],{"class":442},"username",[51,475,398],{"class":91},[51,477,478],{"class":459}," &&",[51,480,481],{"class":416}," \"123456\"",[51,483,65],{"class":91},[51,485,468],{"class":166},[51,487,170],{"class":91},[51,489,490],{"class":442},"password",[51,492,420],{"class":91},[51,494,495],{"class":105}," \u002F\u002F 核心业务代码\n",[51,497,499,502,505,508,511,513],{"class":53,"line":498},18,[51,500,501],{"class":57},"        if",[51,503,504],{"class":91}," (",[51,506,507],{"class":459},"!",[51,509,510],{"class":442},"flag",[51,512,398],{"class":91},[51,514,152],{"class":91},[51,516,518,521,523,526,528,531,533,535,537],{"class":53,"line":517},19,[51,519,520],{"class":250},"            log",[51,522,65],{"class":91},[51,524,525],{"class":166},"error",[51,527,170],{"class":91},[51,529,530],{"class":416},"\"{} 登陆失败\"",[51,532,181],{"class":91},[51,534,178],{"class":442},[51,536,420],{"class":91},[51,538,423],{"class":105},[51,540,542,545,548],{"class":53,"line":541},20,[51,543,544],{"class":91},"        }",[51,546,547],{"class":57}," else",[51,549,152],{"class":91},[51,551,553,555,557,559,561,564,566,568,570],{"class":53,"line":552},21,[51,554,520],{"class":250},[51,556,65],{"class":91},[51,558,411],{"class":166},[51,560,170],{"class":91},[51,562,563],{"class":416},"\"{} 登陆成功\"",[51,565,181],{"class":91},[51,567,178],{"class":442},[51,569,420],{"class":91},[51,571,423],{"class":105},[51,573,575],{"class":53,"line":574},22,[51,576,577],{"class":91},"        }\n",[51,579,581,584,586],{"class":53,"line":580},23,[51,582,583],{"class":57},"        return",[51,585,456],{"class":442},[51,587,92],{"class":91},[51,589,591],{"class":53,"line":590},24,[51,592,593],{"class":91},"    }\n",[51,595,597],{"class":53,"line":596},25,[51,598,196],{"class":91},[10,600,601],{},"3.编写测试类测试功能",[40,603,606],{"className":42,"code":604,"filename":605,"language":45,"meta":46,"style":46},"package top.dhbxs.demo.springaop.staticproxy.service;\n\nimport org.junit.jupiter.api.Test;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport top.dhbxs.demo.springaop.staticproxy.service.impl.LoginServiceImpl;\n\n@SpringBootTest\nclass LoginServiceTest {\n\n    @Test\n    void login() {\n        LoginService loginService = new LoginServiceImpl();\n\n        boolean flag = loginService.login(\"admin\", \"123456\");\n        System.out.println(\"flag = \" + flag);\n    }\n}\n","LoginServiceTest.java",[48,607,608,636,640,669,702,739,743,750,760,764,771,783,801,805,831,858,862],{"__ignoreMap":46},[51,609,610,612,614,616,618,620,622,624,626,628,630,632,634],{"class":53,"line":54},[51,611,58],{"class":57},[51,613,61],{"class":57},[51,615,65],{"class":64},[51,617,68],{"class":57},[51,619,65],{"class":64},[51,621,73],{"class":57},[51,623,65],{"class":64},[51,625,78],{"class":57},[51,627,65],{"class":64},[51,629,83],{"class":57},[51,631,65],{"class":64},[51,633,88],{"class":57},[51,635,92],{"class":91},[51,637,638],{"class":53,"line":95},[51,639,99],{"emptyLinePlaceholder":98},[51,641,642,644,647,649,652,654,657,659,662,664,667],{"class":53,"line":102},[51,643,247],{"class":57},[51,645,646],{"class":250}," org",[51,648,65],{"class":254},[51,650,651],{"class":250},"junit",[51,653,65],{"class":254},[51,655,656],{"class":250},"jupiter",[51,658,65],{"class":254},[51,660,661],{"class":250},"api",[51,663,65],{"class":254},[51,665,666],{"class":250},"Test",[51,668,92],{"class":91},[51,670,671,673,675,677,680,682,685,687,690,692,695,697,700],{"class":53,"line":109},[51,672,247],{"class":57},[51,674,646],{"class":250},[51,676,65],{"class":254},[51,678,679],{"class":250},"springframework",[51,681,65],{"class":254},[51,683,684],{"class":250},"boot",[51,686,65],{"class":254},[51,688,689],{"class":250},"test",[51,691,65],{"class":254},[51,693,694],{"class":250},"context",[51,696,65],{"class":254},[51,698,699],{"class":250},"SpringBootTest",[51,701,92],{"class":91},[51,703,704,706,708,710,712,714,716,718,720,722,724,726,728,730,732,734,737],{"class":53,"line":122},[51,705,247],{"class":57},[51,707,61],{"class":250},[51,709,65],{"class":254},[51,711,68],{"class":250},[51,713,65],{"class":254},[51,715,73],{"class":250},[51,717,65],{"class":254},[51,719,78],{"class":250},[51,721,65],{"class":254},[51,723,83],{"class":250},[51,725,65],{"class":254},[51,727,88],{"class":250},[51,729,65],{"class":254},[51,731,236],{"class":250},[51,733,65],{"class":254},[51,735,736],{"class":250},"LoginServiceImpl",[51,738,92],{"class":91},[51,740,741],{"class":53,"line":133},[51,742,99],{"emptyLinePlaceholder":98},[51,744,745,747],{"class":53,"line":139},[51,746,336],{"class":335},[51,748,749],{"class":339},"SpringBootTest\n",[51,751,752,755,758],{"class":53,"line":155},[51,753,754],{"class":57},"class",[51,756,757],{"class":148}," LoginServiceTest",[51,759,152],{"class":91},[51,761,762],{"class":53,"line":160},[51,763,99],{"emptyLinePlaceholder":98},[51,765,766,768],{"class":53,"line":193},[51,767,369],{"class":335},[51,769,770],{"class":339},"Test\n",[51,772,773,776,778,781],{"class":53,"line":343},[51,774,775],{"class":57},"    void",[51,777,167],{"class":166},[51,779,780],{"class":91},"()",[51,782,152],{"class":91},[51,784,785,788,791,793,796,798],{"class":53,"line":361},[51,786,787],{"class":173},"        LoginService",[51,789,790],{"class":455}," loginService",[51,792,460],{"class":459},[51,794,795],{"class":57}," new",[51,797,351],{"class":166},[51,799,800],{"class":91},"();\n",[51,802,803],{"class":53,"line":366},[51,804,99],{"emptyLinePlaceholder":98},[51,806,807,809,811,813,815,817,820,822,825,827,829],{"class":53,"line":375},[51,808,452],{"class":57},[51,810,456],{"class":455},[51,812,460],{"class":459},[51,814,790],{"class":250},[51,816,65],{"class":91},[51,818,819],{"class":166},"login",[51,821,170],{"class":91},[51,823,824],{"class":416},"\"admin\"",[51,826,181],{"class":91},[51,828,481],{"class":416},[51,830,190],{"class":91},[51,832,833,836,838,841,843,846,848,851,854,856],{"class":53,"line":403},[51,834,835],{"class":250},"        System",[51,837,65],{"class":91},[51,839,840],{"class":250},"out",[51,842,65],{"class":91},[51,844,845],{"class":166},"println",[51,847,170],{"class":91},[51,849,850],{"class":416},"\"flag = \"",[51,852,853],{"class":459}," +",[51,855,456],{"class":442},[51,857,190],{"class":91},[51,859,860],{"class":53,"line":426},[51,861,593],{"class":91},[51,863,864],{"class":53,"line":449},[51,865,196],{"class":91},[10,867,868],{},"4.输出如下",[40,870,873],{"className":42,"code":871,"filename":872,"language":45,"meta":46,"style":46},"2026-04-19T22:17:05.145+08:00  INFO 28308 --- [SpringAOP] [           main] t.d.d.s.s.service.impl.LoginServiceImpl  : 开始登陆\n2026-04-19T22:17:05.145+08:00  INFO 28308 --- [SpringAOP] [           main] t.d.d.s.s.service.impl.LoginServiceImpl  : admin 正在登陆系统\n2026-04-19T22:17:05.146+08:00  INFO 28308 --- [SpringAOP] [           main] t.d.d.s.s.service.impl.LoginServiceImpl  : admin 登陆成功\nflag = true\n","console.log",[48,874,875,988,1075,1163],{"__ignoreMap":46},[51,876,877,881,884,887,889,892,895,898,900,903,905,909,912,915,917,920,923,926,930,932,936,939,942,944,947,949,952,954,957,959,961,963,966,968,970,972,974,976,978,980,982,985],{"class":53,"line":54},[51,878,880],{"class":879},"sYQis","2026",[51,882,883],{"class":459},"-",[51,885,886],{"class":879},"04",[51,888,883],{"class":459},[51,890,891],{"class":455},"19T22",[51,893,894],{"class":57},":",[51,896,897],{"class":879},"17",[51,899,894],{"class":57},[51,901,902],{"class":879},"05",[51,904,65],{"class":91},[51,906,908],{"class":907},"s3HXw","145",[51,910,911],{"class":459},"+",[51,913,914],{"class":455},"08",[51,916,894],{"class":57},[51,918,919],{"class":879},"00",[51,921,922],{"class":455},"  INFO ",[51,924,925],{"class":879},"28308",[51,927,929],{"class":928},"sxizN"," --",[51,931,883],{"class":459},[51,933,935],{"class":934},"syBBb"," [",[51,937,938],{"class":455},"SpringAOP",[51,940,941],{"class":934},"]",[51,943,935],{"class":934},[51,945,946],{"class":455},"           main",[51,948,941],{"class":934},[51,950,951],{"class":250}," t",[51,953,65],{"class":91},[51,955,956],{"class":250},"d",[51,958,65],{"class":91},[51,960,956],{"class":250},[51,962,65],{"class":91},[51,964,965],{"class":250},"s",[51,967,65],{"class":91},[51,969,965],{"class":250},[51,971,65],{"class":91},[51,973,88],{"class":250},[51,975,65],{"class":91},[51,977,236],{"class":250},[51,979,65],{"class":91},[51,981,736],{"class":250},[51,983,984],{"class":57},"  :",[51,986,987],{"class":455}," 开始登陆\n",[51,989,990,992,994,996,998,1000,1002,1004,1006,1008,1010,1012,1014,1016,1018,1020,1022,1024,1026,1028,1030,1032,1034,1036,1038,1040,1042,1044,1046,1048,1050,1052,1054,1056,1058,1060,1062,1064,1066,1068,1070,1072],{"class":53,"line":95},[51,991,880],{"class":879},[51,993,883],{"class":459},[51,995,886],{"class":879},[51,997,883],{"class":459},[51,999,891],{"class":455},[51,1001,894],{"class":57},[51,1003,897],{"class":879},[51,1005,894],{"class":57},[51,1007,902],{"class":879},[51,1009,65],{"class":91},[51,1011,908],{"class":907},[51,1013,911],{"class":459},[51,1015,914],{"class":455},[51,1017,894],{"class":57},[51,1019,919],{"class":879},[51,1021,922],{"class":455},[51,1023,925],{"class":879},[51,1025,929],{"class":928},[51,1027,883],{"class":459},[51,1029,935],{"class":934},[51,1031,938],{"class":455},[51,1033,941],{"class":934},[51,1035,935],{"class":934},[51,1037,946],{"class":455},[51,1039,941],{"class":934},[51,1041,951],{"class":250},[51,1043,65],{"class":91},[51,1045,956],{"class":250},[51,1047,65],{"class":91},[51,1049,956],{"class":250},[51,1051,65],{"class":91},[51,1053,965],{"class":250},[51,1055,65],{"class":91},[51,1057,965],{"class":250},[51,1059,65],{"class":91},[51,1061,88],{"class":250},[51,1063,65],{"class":91},[51,1065,236],{"class":250},[51,1067,65],{"class":91},[51,1069,736],{"class":250},[51,1071,984],{"class":57},[51,1073,1074],{"class":455}," admin 正在登陆系统\n",[51,1076,1077,1079,1081,1083,1085,1087,1089,1091,1093,1095,1097,1100,1102,1104,1106,1108,1110,1112,1114,1116,1118,1120,1122,1124,1126,1128,1130,1132,1134,1136,1138,1140,1142,1144,1146,1148,1150,1152,1154,1156,1158,1160],{"class":53,"line":102},[51,1078,880],{"class":879},[51,1080,883],{"class":459},[51,1082,886],{"class":879},[51,1084,883],{"class":459},[51,1086,891],{"class":455},[51,1088,894],{"class":57},[51,1090,897],{"class":879},[51,1092,894],{"class":57},[51,1094,902],{"class":879},[51,1096,65],{"class":91},[51,1098,1099],{"class":907},"146",[51,1101,911],{"class":459},[51,1103,914],{"class":455},[51,1105,894],{"class":57},[51,1107,919],{"class":879},[51,1109,922],{"class":455},[51,1111,925],{"class":879},[51,1113,929],{"class":928},[51,1115,883],{"class":459},[51,1117,935],{"class":934},[51,1119,938],{"class":455},[51,1121,941],{"class":934},[51,1123,935],{"class":934},[51,1125,946],{"class":455},[51,1127,941],{"class":934},[51,1129,951],{"class":250},[51,1131,65],{"class":91},[51,1133,956],{"class":250},[51,1135,65],{"class":91},[51,1137,956],{"class":250},[51,1139,65],{"class":91},[51,1141,965],{"class":250},[51,1143,65],{"class":91},[51,1145,965],{"class":250},[51,1147,65],{"class":91},[51,1149,88],{"class":250},[51,1151,65],{"class":91},[51,1153,236],{"class":250},[51,1155,65],{"class":91},[51,1157,736],{"class":250},[51,1159,984],{"class":57},[51,1161,1162],{"class":455}," admin 登陆成功\n",[51,1164,1165,1168,1171],{"class":53,"line":109},[51,1166,1167],{"class":455},"flag ",[51,1169,1170],{"class":459},"=",[51,1172,1174],{"class":1173},"sFiMs"," true\n",[10,1176,1177],{},"以上就是非常简单直接的一个登陆逻辑，可以在 LoginServiceImpl 代码中看到有很多非业务相关的日志记录的代码，和业务逻辑是深度耦合的。",[10,1179,1180],{},"接下来使用代理模式中的静态代理来优化解耦。",[27,1182,1183],{"id":1183},"静态代理解耦",[10,1185,1186],{},"1.创建一个代理类，实现相同的 LoginService 接口",[40,1188,1191],{"className":42,"code":1189,"filename":1190,"language":45,"meta":46,"style":46},"package top.dhbxs.demo.springaop.staticproxy.service.proxy;\n\nimport lombok.extern.slf4j.Slf4j;\nimport top.dhbxs.demo.springaop.staticproxy.service.LoginService;\nimport top.dhbxs.demo.springaop.staticproxy.service.impl.LoginServiceImpl;\n\n\u002F**\n * 静态代理：解决代码耦合\n * 代理类和目标类都实现了同一个接口\n *\n * @author dhbxs\n * @since 2026\u002F4\u002F19\n *\u002F\n@Slf4j\npublic class LoginServiceProxy implements LoginService {\n\n\n    \u002F**\n     * 代理方法，帮你调用目标\n     *\n     * @param username 用户名\n     * @param password 密码\n     * @return 登陆结果\n     *\u002F\n    @Override\n    public boolean login(String username, String password) {\n\n\n        log.info(\"开始登陆\"); \u002F\u002F 日志：非核心业务代码\n        log.info(\"{} 正在登陆系统\", username); \u002F\u002F 日志：非核心业务代码\n\n        LoginService loginService = new LoginServiceImpl(); \u002F\u002F 创建目标对象\n        boolean flag = loginService.login(username, password); \u002F\u002F 调用目标方法\n\n        if (!flag) {\n            log.error(\"{} 登陆失败\", username); \u002F\u002F 日志：非核心业务代码\n        } else {\n            log.info(\"{} 登陆成功\", username); \u002F\u002F 日志：非核心业务代码\n        }\n\n        return flag;\n    }\n}\n","LoginServiceProxy.java",[48,1192,1193,1226,1230,1250,1282,1318,1322,1326,1331,1336,1341,1349,1357,1361,1367,1382,1386,1390,1395,1400,1405,1418,1429,1439,1444,1450,1475,1480,1485,1502,1523,1528,1547,1575,1580,1595,1616,1625,1646,1651,1656,1665,1670],{"__ignoreMap":46},[51,1194,1195,1197,1199,1201,1203,1205,1207,1209,1211,1213,1215,1217,1219,1221,1224],{"class":53,"line":54},[51,1196,58],{"class":57},[51,1198,61],{"class":57},[51,1200,65],{"class":64},[51,1202,68],{"class":57},[51,1204,65],{"class":64},[51,1206,73],{"class":57},[51,1208,65],{"class":64},[51,1210,78],{"class":57},[51,1212,65],{"class":64},[51,1214,83],{"class":57},[51,1216,65],{"class":64},[51,1218,88],{"class":57},[51,1220,65],{"class":64},[51,1222,1223],{"class":57},"proxy",[51,1225,92],{"class":91},[51,1227,1228],{"class":53,"line":95},[51,1229,99],{"emptyLinePlaceholder":98},[51,1231,1232,1234,1236,1238,1240,1242,1244,1246,1248],{"class":53,"line":102},[51,1233,247],{"class":57},[51,1235,251],{"class":250},[51,1237,65],{"class":254},[51,1239,257],{"class":250},[51,1241,65],{"class":254},[51,1243,262],{"class":250},[51,1245,65],{"class":254},[51,1247,267],{"class":250},[51,1249,92],{"class":91},[51,1251,1252,1254,1256,1258,1260,1262,1264,1266,1268,1270,1272,1274,1276,1278,1280],{"class":53,"line":109},[51,1253,247],{"class":57},[51,1255,61],{"class":250},[51,1257,65],{"class":254},[51,1259,68],{"class":250},[51,1261,65],{"class":254},[51,1263,73],{"class":250},[51,1265,65],{"class":254},[51,1267,78],{"class":250},[51,1269,65],{"class":254},[51,1271,83],{"class":250},[51,1273,65],{"class":254},[51,1275,88],{"class":250},[51,1277,65],{"class":254},[51,1279,300],{"class":250},[51,1281,92],{"class":91},[51,1283,1284,1286,1288,1290,1292,1294,1296,1298,1300,1302,1304,1306,1308,1310,1312,1314,1316],{"class":53,"line":122},[51,1285,247],{"class":57},[51,1287,61],{"class":250},[51,1289,65],{"class":254},[51,1291,68],{"class":250},[51,1293,65],{"class":254},[51,1295,73],{"class":250},[51,1297,65],{"class":254},[51,1299,78],{"class":250},[51,1301,65],{"class":254},[51,1303,83],{"class":250},[51,1305,65],{"class":254},[51,1307,88],{"class":250},[51,1309,65],{"class":254},[51,1311,236],{"class":250},[51,1313,65],{"class":254},[51,1315,736],{"class":250},[51,1317,92],{"class":91},[51,1319,1320],{"class":53,"line":133},[51,1321,99],{"emptyLinePlaceholder":98},[51,1323,1324],{"class":53,"line":139},[51,1325,106],{"class":105},[51,1327,1328],{"class":53,"line":155},[51,1329,1330],{"class":105}," * 静态代理：解决代码耦合\n",[51,1332,1333],{"class":53,"line":160},[51,1334,1335],{"class":105}," * 代理类和目标类都实现了同一个接口\n",[51,1337,1338],{"class":53,"line":193},[51,1339,1340],{"class":105}," *\n",[51,1342,1343,1345,1347],{"class":53,"line":343},[51,1344,112],{"class":105},[51,1346,116],{"class":115},[51,1348,119],{"class":105},[51,1350,1351,1353,1355],{"class":53,"line":361},[51,1352,112],{"class":105},[51,1354,127],{"class":115},[51,1356,130],{"class":105},[51,1358,1359],{"class":53,"line":366},[51,1360,136],{"class":105},[51,1362,1363,1365],{"class":53,"line":375},[51,1364,336],{"class":335},[51,1366,340],{"class":339},[51,1368,1369,1371,1373,1376,1378,1380],{"class":53,"line":403},[51,1370,142],{"class":57},[51,1372,348],{"class":57},[51,1374,1375],{"class":148}," LoginServiceProxy",[51,1377,354],{"class":57},[51,1379,149],{"class":148},[51,1381,152],{"class":91},[51,1383,1384],{"class":53,"line":426},[51,1385,99],{"emptyLinePlaceholder":98},[51,1387,1388],{"class":53,"line":449},[51,1389,99],{"emptyLinePlaceholder":98},[51,1391,1392],{"class":53,"line":498},[51,1393,1394],{"class":105},"    \u002F**\n",[51,1396,1397],{"class":53,"line":517},[51,1398,1399],{"class":105},"     * 代理方法，帮你调用目标\n",[51,1401,1402],{"class":53,"line":541},[51,1403,1404],{"class":105},"     *\n",[51,1406,1407,1410,1413,1415],{"class":53,"line":552},[51,1408,1409],{"class":105},"     * ",[51,1411,1412],{"class":115},"@param",[51,1414,178],{"class":177},[51,1416,1417],{"class":105}," 用户名\n",[51,1419,1420,1422,1424,1426],{"class":53,"line":574},[51,1421,1409],{"class":105},[51,1423,1412],{"class":115},[51,1425,187],{"class":177},[51,1427,1428],{"class":105}," 密码\n",[51,1430,1431,1433,1436],{"class":53,"line":580},[51,1432,1409],{"class":105},[51,1434,1435],{"class":115},"@return",[51,1437,1438],{"class":105}," 登陆结果\n",[51,1440,1441],{"class":53,"line":590},[51,1442,1443],{"class":105},"     *\u002F\n",[51,1445,1446,1448],{"class":53,"line":596},[51,1447,369],{"class":335},[51,1449,372],{"class":339},[51,1451,1453,1455,1457,1459,1461,1463,1465,1467,1469,1471,1473],{"class":53,"line":1452},26,[51,1454,378],{"class":57},[51,1456,381],{"class":57},[51,1458,167],{"class":166},[51,1460,170],{"class":91},[51,1462,174],{"class":173},[51,1464,178],{"class":177},[51,1466,181],{"class":91},[51,1468,184],{"class":173},[51,1470,187],{"class":177},[51,1472,398],{"class":91},[51,1474,152],{"class":91},[51,1476,1478],{"class":53,"line":1477},27,[51,1479,99],{"emptyLinePlaceholder":98},[51,1481,1483],{"class":53,"line":1482},28,[51,1484,99],{"emptyLinePlaceholder":98},[51,1486,1488,1490,1492,1494,1496,1498,1500],{"class":53,"line":1487},29,[51,1489,406],{"class":250},[51,1491,65],{"class":91},[51,1493,411],{"class":166},[51,1495,170],{"class":91},[51,1497,417],{"class":416},[51,1499,420],{"class":91},[51,1501,423],{"class":105},[51,1503,1505,1507,1509,1511,1513,1515,1517,1519,1521],{"class":53,"line":1504},30,[51,1506,406],{"class":250},[51,1508,65],{"class":91},[51,1510,411],{"class":166},[51,1512,170],{"class":91},[51,1514,437],{"class":416},[51,1516,181],{"class":91},[51,1518,178],{"class":442},[51,1520,420],{"class":91},[51,1522,423],{"class":105},[51,1524,1526],{"class":53,"line":1525},31,[51,1527,99],{"emptyLinePlaceholder":98},[51,1529,1531,1533,1535,1537,1539,1541,1544],{"class":53,"line":1530},32,[51,1532,787],{"class":173},[51,1534,790],{"class":455},[51,1536,460],{"class":459},[51,1538,795],{"class":57},[51,1540,351],{"class":166},[51,1542,1543],{"class":91},"();",[51,1545,1546],{"class":105}," \u002F\u002F 创建目标对象\n",[51,1548,1550,1552,1554,1556,1558,1560,1562,1564,1566,1568,1570,1572],{"class":53,"line":1549},33,[51,1551,452],{"class":57},[51,1553,456],{"class":455},[51,1555,460],{"class":459},[51,1557,790],{"class":250},[51,1559,65],{"class":91},[51,1561,819],{"class":166},[51,1563,170],{"class":91},[51,1565,473],{"class":442},[51,1567,181],{"class":91},[51,1569,187],{"class":442},[51,1571,420],{"class":91},[51,1573,1574],{"class":105}," \u002F\u002F 调用目标方法\n",[51,1576,1578],{"class":53,"line":1577},34,[51,1579,99],{"emptyLinePlaceholder":98},[51,1581,1583,1585,1587,1589,1591,1593],{"class":53,"line":1582},35,[51,1584,501],{"class":57},[51,1586,504],{"class":91},[51,1588,507],{"class":459},[51,1590,510],{"class":442},[51,1592,398],{"class":91},[51,1594,152],{"class":91},[51,1596,1598,1600,1602,1604,1606,1608,1610,1612,1614],{"class":53,"line":1597},36,[51,1599,520],{"class":250},[51,1601,65],{"class":91},[51,1603,525],{"class":166},[51,1605,170],{"class":91},[51,1607,530],{"class":416},[51,1609,181],{"class":91},[51,1611,178],{"class":442},[51,1613,420],{"class":91},[51,1615,423],{"class":105},[51,1617,1619,1621,1623],{"class":53,"line":1618},37,[51,1620,544],{"class":91},[51,1622,547],{"class":57},[51,1624,152],{"class":91},[51,1626,1628,1630,1632,1634,1636,1638,1640,1642,1644],{"class":53,"line":1627},38,[51,1629,520],{"class":250},[51,1631,65],{"class":91},[51,1633,411],{"class":166},[51,1635,170],{"class":91},[51,1637,563],{"class":416},[51,1639,181],{"class":91},[51,1641,178],{"class":442},[51,1643,420],{"class":91},[51,1645,423],{"class":105},[51,1647,1649],{"class":53,"line":1648},39,[51,1650,577],{"class":91},[51,1652,1654],{"class":53,"line":1653},40,[51,1655,99],{"emptyLinePlaceholder":98},[51,1657,1659,1661,1663],{"class":53,"line":1658},41,[51,1660,583],{"class":57},[51,1662,456],{"class":442},[51,1664,92],{"class":91},[51,1666,1668],{"class":53,"line":1667},42,[51,1669,593],{"class":91},[51,1671,1673],{"class":53,"line":1672},43,[51,1674,196],{"class":91},[10,1676,1677],{},"2.修改原来的 LoginServiceImpl 接口",[40,1679,1681],{"className":42,"code":1680,"filename":203,"language":45,"meta":46,"style":46},"package top.dhbxs.demo.springaop.staticproxy.service.impl;\n\nimport lombok.extern.slf4j.Slf4j;\nimport top.dhbxs.demo.springaop.staticproxy.service.LoginService;\n\n\u002F**\n * @author dhbxs\n * @since 2026\u002F4\u002F19\n *\u002F\n@Slf4j\npublic class LoginServiceImpl implements LoginService {\n\n    @Override\n    public boolean login(String username, String password) {\n\n        boolean flag = \"admin\".equals(username) && \"123456\".equals(password); \u002F\u002F 核心业务代码\n\n        return flag;\n    }\n}\n",[48,1682,1683,1715,1719,1739,1771,1775,1779,1787,1795,1799,1805,1819,1823,1829,1853,1857,1893,1897,1905,1909],{"__ignoreMap":46},[51,1684,1685,1687,1689,1691,1693,1695,1697,1699,1701,1703,1705,1707,1709,1711,1713],{"class":53,"line":54},[51,1686,58],{"class":57},[51,1688,61],{"class":57},[51,1690,65],{"class":64},[51,1692,68],{"class":57},[51,1694,65],{"class":64},[51,1696,73],{"class":57},[51,1698,65],{"class":64},[51,1700,78],{"class":57},[51,1702,65],{"class":64},[51,1704,83],{"class":57},[51,1706,65],{"class":64},[51,1708,88],{"class":57},[51,1710,65],{"class":64},[51,1712,236],{"class":57},[51,1714,92],{"class":91},[51,1716,1717],{"class":53,"line":95},[51,1718,99],{"emptyLinePlaceholder":98},[51,1720,1721,1723,1725,1727,1729,1731,1733,1735,1737],{"class":53,"line":102},[51,1722,247],{"class":57},[51,1724,251],{"class":250},[51,1726,65],{"class":254},[51,1728,257],{"class":250},[51,1730,65],{"class":254},[51,1732,262],{"class":250},[51,1734,65],{"class":254},[51,1736,267],{"class":250},[51,1738,92],{"class":91},[51,1740,1741,1743,1745,1747,1749,1751,1753,1755,1757,1759,1761,1763,1765,1767,1769],{"class":53,"line":109},[51,1742,247],{"class":57},[51,1744,61],{"class":250},[51,1746,65],{"class":254},[51,1748,68],{"class":250},[51,1750,65],{"class":254},[51,1752,73],{"class":250},[51,1754,65],{"class":254},[51,1756,78],{"class":250},[51,1758,65],{"class":254},[51,1760,83],{"class":250},[51,1762,65],{"class":254},[51,1764,88],{"class":250},[51,1766,65],{"class":254},[51,1768,300],{"class":250},[51,1770,92],{"class":91},[51,1772,1773],{"class":53,"line":122},[51,1774,99],{"emptyLinePlaceholder":98},[51,1776,1777],{"class":53,"line":133},[51,1778,106],{"class":105},[51,1780,1781,1783,1785],{"class":53,"line":139},[51,1782,112],{"class":105},[51,1784,116],{"class":115},[51,1786,119],{"class":105},[51,1788,1789,1791,1793],{"class":53,"line":155},[51,1790,112],{"class":105},[51,1792,127],{"class":115},[51,1794,130],{"class":105},[51,1796,1797],{"class":53,"line":160},[51,1798,136],{"class":105},[51,1800,1801,1803],{"class":53,"line":193},[51,1802,336],{"class":335},[51,1804,340],{"class":339},[51,1806,1807,1809,1811,1813,1815,1817],{"class":53,"line":343},[51,1808,142],{"class":57},[51,1810,348],{"class":57},[51,1812,351],{"class":148},[51,1814,354],{"class":57},[51,1816,149],{"class":148},[51,1818,152],{"class":91},[51,1820,1821],{"class":53,"line":361},[51,1822,99],{"emptyLinePlaceholder":98},[51,1824,1825,1827],{"class":53,"line":366},[51,1826,369],{"class":335},[51,1828,372],{"class":339},[51,1830,1831,1833,1835,1837,1839,1841,1843,1845,1847,1849,1851],{"class":53,"line":375},[51,1832,378],{"class":57},[51,1834,381],{"class":57},[51,1836,167],{"class":166},[51,1838,170],{"class":91},[51,1840,174],{"class":173},[51,1842,178],{"class":177},[51,1844,181],{"class":91},[51,1846,184],{"class":173},[51,1848,187],{"class":177},[51,1850,398],{"class":91},[51,1852,152],{"class":91},[51,1854,1855],{"class":53,"line":403},[51,1856,99],{"emptyLinePlaceholder":98},[51,1858,1859,1861,1863,1865,1867,1869,1871,1873,1875,1877,1879,1881,1883,1885,1887,1889,1891],{"class":53,"line":426},[51,1860,452],{"class":57},[51,1862,456],{"class":455},[51,1864,460],{"class":459},[51,1866,463],{"class":416},[51,1868,65],{"class":91},[51,1870,468],{"class":166},[51,1872,170],{"class":91},[51,1874,473],{"class":442},[51,1876,398],{"class":91},[51,1878,478],{"class":459},[51,1880,481],{"class":416},[51,1882,65],{"class":91},[51,1884,468],{"class":166},[51,1886,170],{"class":91},[51,1888,490],{"class":442},[51,1890,420],{"class":91},[51,1892,495],{"class":105},[51,1894,1895],{"class":53,"line":449},[51,1896,99],{"emptyLinePlaceholder":98},[51,1898,1899,1901,1903],{"class":53,"line":498},[51,1900,583],{"class":57},[51,1902,456],{"class":442},[51,1904,92],{"class":91},[51,1906,1907],{"class":53,"line":517},[51,1908,593],{"class":91},[51,1910,1911],{"class":53,"line":541},[51,1912,196],{"class":91},[10,1914,1915],{},"3.修改测试类，调用代理类实现业务",[40,1917,1919],{"className":42,"code":1918,"filename":605,"language":45,"meta":46,"style":46},"package top.dhbxs.demo.springaop.staticproxy.service;\n\nimport org.junit.jupiter.api.Test;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport top.dhbxs.demo.springaop.staticproxy.service.proxy.LoginServiceProxy;\n\n@SpringBootTest\nclass LoginServiceTest {\n\n    @Test\n    void login() {\n        LoginService loginService = new LoginServiceProxy(); \u002F\u002F 创建代理对象\n\n        boolean flag = loginService.login(\"admin\", \"123456\"); \u002F\u002F 调用代理对象方法\n        System.out.println(\"flag = \" + flag);\n    }\n}\n",[48,1920,1921,1949,1953,1977,2005,2042,2046,2052,2060,2064,2070,2080,2097,2101,2128,2150,2154],{"__ignoreMap":46},[51,1922,1923,1925,1927,1929,1931,1933,1935,1937,1939,1941,1943,1945,1947],{"class":53,"line":54},[51,1924,58],{"class":57},[51,1926,61],{"class":57},[51,1928,65],{"class":64},[51,1930,68],{"class":57},[51,1932,65],{"class":64},[51,1934,73],{"class":57},[51,1936,65],{"class":64},[51,1938,78],{"class":57},[51,1940,65],{"class":64},[51,1942,83],{"class":57},[51,1944,65],{"class":64},[51,1946,88],{"class":57},[51,1948,92],{"class":91},[51,1950,1951],{"class":53,"line":95},[51,1952,99],{"emptyLinePlaceholder":98},[51,1954,1955,1957,1959,1961,1963,1965,1967,1969,1971,1973,1975],{"class":53,"line":102},[51,1956,247],{"class":57},[51,1958,646],{"class":250},[51,1960,65],{"class":254},[51,1962,651],{"class":250},[51,1964,65],{"class":254},[51,1966,656],{"class":250},[51,1968,65],{"class":254},[51,1970,661],{"class":250},[51,1972,65],{"class":254},[51,1974,666],{"class":250},[51,1976,92],{"class":91},[51,1978,1979,1981,1983,1985,1987,1989,1991,1993,1995,1997,1999,2001,2003],{"class":53,"line":109},[51,1980,247],{"class":57},[51,1982,646],{"class":250},[51,1984,65],{"class":254},[51,1986,679],{"class":250},[51,1988,65],{"class":254},[51,1990,684],{"class":250},[51,1992,65],{"class":254},[51,1994,689],{"class":250},[51,1996,65],{"class":254},[51,1998,694],{"class":250},[51,2000,65],{"class":254},[51,2002,699],{"class":250},[51,2004,92],{"class":91},[51,2006,2007,2009,2011,2013,2015,2017,2019,2021,2023,2025,2027,2029,2031,2033,2035,2037,2040],{"class":53,"line":122},[51,2008,247],{"class":57},[51,2010,61],{"class":250},[51,2012,65],{"class":254},[51,2014,68],{"class":250},[51,2016,65],{"class":254},[51,2018,73],{"class":250},[51,2020,65],{"class":254},[51,2022,78],{"class":250},[51,2024,65],{"class":254},[51,2026,83],{"class":250},[51,2028,65],{"class":254},[51,2030,88],{"class":250},[51,2032,65],{"class":254},[51,2034,1223],{"class":250},[51,2036,65],{"class":254},[51,2038,2039],{"class":250},"LoginServiceProxy",[51,2041,92],{"class":91},[51,2043,2044],{"class":53,"line":133},[51,2045,99],{"emptyLinePlaceholder":98},[51,2047,2048,2050],{"class":53,"line":139},[51,2049,336],{"class":335},[51,2051,749],{"class":339},[51,2053,2054,2056,2058],{"class":53,"line":155},[51,2055,754],{"class":57},[51,2057,757],{"class":148},[51,2059,152],{"class":91},[51,2061,2062],{"class":53,"line":160},[51,2063,99],{"emptyLinePlaceholder":98},[51,2065,2066,2068],{"class":53,"line":193},[51,2067,369],{"class":335},[51,2069,770],{"class":339},[51,2071,2072,2074,2076,2078],{"class":53,"line":343},[51,2073,775],{"class":57},[51,2075,167],{"class":166},[51,2077,780],{"class":91},[51,2079,152],{"class":91},[51,2081,2082,2084,2086,2088,2090,2092,2094],{"class":53,"line":361},[51,2083,787],{"class":173},[51,2085,790],{"class":455},[51,2087,460],{"class":459},[51,2089,795],{"class":57},[51,2091,1375],{"class":166},[51,2093,1543],{"class":91},[51,2095,2096],{"class":105}," \u002F\u002F 创建代理对象\n",[51,2098,2099],{"class":53,"line":366},[51,2100,99],{"emptyLinePlaceholder":98},[51,2102,2103,2105,2107,2109,2111,2113,2115,2117,2119,2121,2123,2125],{"class":53,"line":375},[51,2104,452],{"class":57},[51,2106,456],{"class":455},[51,2108,460],{"class":459},[51,2110,790],{"class":250},[51,2112,65],{"class":91},[51,2114,819],{"class":166},[51,2116,170],{"class":91},[51,2118,824],{"class":416},[51,2120,181],{"class":91},[51,2122,481],{"class":416},[51,2124,420],{"class":91},[51,2126,2127],{"class":105}," \u002F\u002F 调用代理对象方法\n",[51,2129,2130,2132,2134,2136,2138,2140,2142,2144,2146,2148],{"class":53,"line":403},[51,2131,835],{"class":250},[51,2133,65],{"class":91},[51,2135,840],{"class":250},[51,2137,65],{"class":91},[51,2139,845],{"class":166},[51,2141,170],{"class":91},[51,2143,850],{"class":416},[51,2145,853],{"class":459},[51,2147,456],{"class":442},[51,2149,190],{"class":91},[51,2151,2152],{"class":53,"line":426},[51,2153,593],{"class":91},[51,2155,2156],{"class":53,"line":449},[51,2157,196],{"class":91},[10,2159,2160],{},"修改后，我们通过 LoginServiceProxy 实现相同的 LoginService 接口，然后调用方直接调用我们的 Proxy 代理对象，由代理对象通义打印日志，并由代理对象调用最终目标方法，实现日志功能和业务逻辑解耦合。",[10,2162,2163],{},"但是这种静态代理需要我们一个个手动创建代理类，调用代理对象，还是太麻烦。所以就有了动态代理。",[23,2165,2166],{"id":2166},"动态代理",[2168,2169,2170,2201],"ul",{},[2171,2172,2173,2174],"li",{},"JDK 动态代理\n",[2168,2175,2176,2179,2198],{},[2171,2177,2178],{},"基于接口实现，代理类和目标类都实现同一个接口。代理类是基于反射机制生成。类名一般是 $Proxy 前缀开头 + 数字",[2171,2180,2181,2182,2185,2186,2191,2192,2197],{},"核心 API：",[48,2183,2184],{"code":2184},"java.lang.reflect"," 包下的 ",[48,2187,2189],{"className":42,"code":2188,"language":45,"style":46},"Proxy",[51,2190,2188],{"class":173},"（生成代理对象）、",[48,2193,2195],{"className":42,"code":2194,"language":45,"style":46},"InvocationHandler",[51,2196,2194],{"class":173},"（定义增强逻辑）",[2171,2199,2200],{},"调用逻辑：A -> C(代理对象 -> h( InvocationHandler.invoke() )) -> B(目标)",[2171,2202,2203,2204],{},"CGLIB 动态代理\n",[2168,2205,2206,2209,2212],{},[2171,2207,2208],{},"基于继承实现，代理类是目标类的子类。代理类是通过第三方插件，字节码生成工具动态生成的内部类。",[2171,2210,2211],{},"无需接口：直接继承目标类生成代理，目标类可以无任何接口",[2171,2213,2181,2214,2191,2219,2224],{},[48,2215,2217],{"className":42,"code":2216,"language":45,"style":46},"Enhancer",[51,2218,2216],{"class":173},[48,2220,2222],{"className":42,"code":2221,"language":45,"style":46},"MethodInterceptor",[51,2223,2221],{"class":173},"（ 定义增强逻辑）",[27,2226,2228],{"id":2227},"jdk-动态代理","JDK 动态代理",[10,2230,2231],{},"新建一个 jdkproxy.service 包，把之前的 LoginService 接口和 LoginServiceImpl 实现类复制到新包下",[10,2233,2234],{},"然后新建测试类",[40,2236,2238],{"className":42,"code":2237,"filename":605,"language":45,"meta":46,"style":46},"package top.dhbxs.demo.springaop.jdkproxy.service;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.junit.jupiter.api.Test;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport top.dhbxs.demo.springaop.jdkproxy.service.impl.LoginServiceImpl;\n\nimport java.lang.reflect.Proxy;\n\n@Slf4j\n@SpringBootTest\nclass LoginServiceTest {\n\n    @Test\n    void login() {\n        \u002F\u002F 创建目标对象\n        LoginService loginService = new LoginServiceImpl();\n\n        \u002F\u002F 创建代理对象\n        LoginService loginServiceProxy = (LoginService) Proxy.newProxyInstance(\n                loginService.getClass().getClassLoader(), \u002F\u002F 目标类的类加载器\n                loginService.getClass().getInterfaces(), \u002F\u002F 目标对象的接口。代理类和目标类实现同一个接口\n                (proxy, method, args) -> { \u002F\u002F InvocationHandler 对象 隐式函数式接口\n                    log.info(\"开始登陆\"); \u002F\u002F 日志：非核心业务代码\n                    log.info(\"{} 正在登陆系统\", args[0]); \u002F\u002F 日志：非核心业务代码\n\n                    boolean flag = (boolean) method.invoke(loginService, args); \u002F\u002F 调用目标方法\n\n                    if (!flag) {\n                        log.error(\"{} 登陆失败\", args[0]); \u002F\u002F 日志：非核心业务代码\n                    } else {\n                        log.info(\"{} 登陆成功\", args[0]); \u002F\u002F 日志：非核心业务代码\n                    }\n\n                    return flag;\n                });\n\n\n        \u002F\u002F 调用代理对象\n        boolean flag = loginServiceProxy.login(\"admin\", \"123456\");\n        System.out.println(\"flag = \" + flag);\n    }\n}\n",[48,2239,2240,2269,2273,2293,2317,2345,2381,2385,2408,2412,2418,2424,2432,2436,2442,2452,2457,2471,2475,2480,2506,2528,2546,2574,2591,2618,2622,2658,2662,2677,2702,2711,2735,2740,2744,2753,2758,2762,2766,2771,2795,2817,2821],{"__ignoreMap":46},[51,2241,2242,2244,2246,2248,2250,2252,2254,2256,2258,2260,2263,2265,2267],{"class":53,"line":54},[51,2243,58],{"class":57},[51,2245,61],{"class":57},[51,2247,65],{"class":64},[51,2249,68],{"class":57},[51,2251,65],{"class":64},[51,2253,73],{"class":57},[51,2255,65],{"class":64},[51,2257,78],{"class":57},[51,2259,65],{"class":64},[51,2261,2262],{"class":57},"jdkproxy",[51,2264,65],{"class":64},[51,2266,88],{"class":57},[51,2268,92],{"class":91},[51,2270,2271],{"class":53,"line":95},[51,2272,99],{"emptyLinePlaceholder":98},[51,2274,2275,2277,2279,2281,2283,2285,2287,2289,2291],{"class":53,"line":102},[51,2276,247],{"class":57},[51,2278,251],{"class":250},[51,2280,65],{"class":254},[51,2282,257],{"class":250},[51,2284,65],{"class":254},[51,2286,262],{"class":250},[51,2288,65],{"class":254},[51,2290,267],{"class":250},[51,2292,92],{"class":91},[51,2294,2295,2297,2299,2301,2303,2305,2307,2309,2311,2313,2315],{"class":53,"line":109},[51,2296,247],{"class":57},[51,2298,646],{"class":250},[51,2300,65],{"class":254},[51,2302,651],{"class":250},[51,2304,65],{"class":254},[51,2306,656],{"class":250},[51,2308,65],{"class":254},[51,2310,661],{"class":250},[51,2312,65],{"class":254},[51,2314,666],{"class":250},[51,2316,92],{"class":91},[51,2318,2319,2321,2323,2325,2327,2329,2331,2333,2335,2337,2339,2341,2343],{"class":53,"line":122},[51,2320,247],{"class":57},[51,2322,646],{"class":250},[51,2324,65],{"class":254},[51,2326,679],{"class":250},[51,2328,65],{"class":254},[51,2330,684],{"class":250},[51,2332,65],{"class":254},[51,2334,689],{"class":250},[51,2336,65],{"class":254},[51,2338,694],{"class":250},[51,2340,65],{"class":254},[51,2342,699],{"class":250},[51,2344,92],{"class":91},[51,2346,2347,2349,2351,2353,2355,2357,2359,2361,2363,2365,2367,2369,2371,2373,2375,2377,2379],{"class":53,"line":133},[51,2348,247],{"class":57},[51,2350,61],{"class":250},[51,2352,65],{"class":254},[51,2354,68],{"class":250},[51,2356,65],{"class":254},[51,2358,73],{"class":250},[51,2360,65],{"class":254},[51,2362,78],{"class":250},[51,2364,65],{"class":254},[51,2366,2262],{"class":250},[51,2368,65],{"class":254},[51,2370,88],{"class":250},[51,2372,65],{"class":254},[51,2374,236],{"class":250},[51,2376,65],{"class":254},[51,2378,736],{"class":250},[51,2380,92],{"class":91},[51,2382,2383],{"class":53,"line":139},[51,2384,99],{"emptyLinePlaceholder":98},[51,2386,2387,2389,2392,2394,2397,2399,2402,2404,2406],{"class":53,"line":155},[51,2388,247],{"class":57},[51,2390,2391],{"class":250}," java",[51,2393,65],{"class":254},[51,2395,2396],{"class":250},"lang",[51,2398,65],{"class":254},[51,2400,2401],{"class":250},"reflect",[51,2403,65],{"class":254},[51,2405,2188],{"class":250},[51,2407,92],{"class":91},[51,2409,2410],{"class":53,"line":160},[51,2411,99],{"emptyLinePlaceholder":98},[51,2413,2414,2416],{"class":53,"line":193},[51,2415,336],{"class":335},[51,2417,340],{"class":339},[51,2419,2420,2422],{"class":53,"line":343},[51,2421,336],{"class":335},[51,2423,749],{"class":339},[51,2425,2426,2428,2430],{"class":53,"line":361},[51,2427,754],{"class":57},[51,2429,757],{"class":148},[51,2431,152],{"class":91},[51,2433,2434],{"class":53,"line":366},[51,2435,99],{"emptyLinePlaceholder":98},[51,2437,2438,2440],{"class":53,"line":375},[51,2439,369],{"class":335},[51,2441,770],{"class":339},[51,2443,2444,2446,2448,2450],{"class":53,"line":403},[51,2445,775],{"class":57},[51,2447,167],{"class":166},[51,2449,780],{"class":91},[51,2451,152],{"class":91},[51,2453,2454],{"class":53,"line":426},[51,2455,2456],{"class":105},"        \u002F\u002F 创建目标对象\n",[51,2458,2459,2461,2463,2465,2467,2469],{"class":53,"line":449},[51,2460,787],{"class":173},[51,2462,790],{"class":455},[51,2464,460],{"class":459},[51,2466,795],{"class":57},[51,2468,351],{"class":166},[51,2470,800],{"class":91},[51,2472,2473],{"class":53,"line":498},[51,2474,99],{"emptyLinePlaceholder":98},[51,2476,2477],{"class":53,"line":517},[51,2478,2479],{"class":105},"        \u002F\u002F 创建代理对象\n",[51,2481,2482,2484,2487,2489,2491,2493,2495,2498,2500,2503],{"class":53,"line":541},[51,2483,787],{"class":173},[51,2485,2486],{"class":455}," loginServiceProxy",[51,2488,460],{"class":459},[51,2490,504],{"class":91},[51,2492,300],{"class":442},[51,2494,398],{"class":91},[51,2496,2497],{"class":250}," Proxy",[51,2499,65],{"class":91},[51,2501,2502],{"class":166},"newProxyInstance",[51,2504,2505],{"class":91},"(\n",[51,2507,2508,2511,2513,2516,2519,2522,2525],{"class":53,"line":552},[51,2509,2510],{"class":250},"                loginService",[51,2512,65],{"class":91},[51,2514,2515],{"class":166},"getClass",[51,2517,2518],{"class":91},"().",[51,2520,2521],{"class":166},"getClassLoader",[51,2523,2524],{"class":91},"(),",[51,2526,2527],{"class":105}," \u002F\u002F 目标类的类加载器\n",[51,2529,2530,2532,2534,2536,2538,2541,2543],{"class":53,"line":574},[51,2531,2510],{"class":250},[51,2533,65],{"class":91},[51,2535,2515],{"class":166},[51,2537,2518],{"class":91},[51,2539,2540],{"class":166},"getInterfaces",[51,2542,2524],{"class":91},[51,2544,2545],{"class":105}," \u002F\u002F 目标对象的接口。代理类和目标类实现同一个接口\n",[51,2547,2548,2551,2553,2555,2558,2560,2563,2565,2568,2571],{"class":53,"line":580},[51,2549,2550],{"class":91},"                (",[51,2552,1223],{"class":442},[51,2554,181],{"class":91},[51,2556,2557],{"class":442}," method",[51,2559,181],{"class":91},[51,2561,2562],{"class":442}," args",[51,2564,398],{"class":91},[51,2566,2567],{"class":57}," ->",[51,2569,2570],{"class":91}," {",[51,2572,2573],{"class":105}," \u002F\u002F InvocationHandler 对象 隐式函数式接口\n",[51,2575,2576,2579,2581,2583,2585,2587,2589],{"class":53,"line":590},[51,2577,2578],{"class":250},"                    log",[51,2580,65],{"class":91},[51,2582,411],{"class":166},[51,2584,170],{"class":91},[51,2586,417],{"class":416},[51,2588,420],{"class":91},[51,2590,423],{"class":105},[51,2592,2593,2595,2597,2599,2601,2603,2605,2607,2610,2613,2616],{"class":53,"line":596},[51,2594,2578],{"class":250},[51,2596,65],{"class":91},[51,2598,411],{"class":166},[51,2600,170],{"class":91},[51,2602,437],{"class":416},[51,2604,181],{"class":91},[51,2606,2562],{"class":442},[51,2608,2609],{"class":91},"[",[51,2611,2612],{"class":879},"0",[51,2614,2615],{"class":91},"]);",[51,2617,423],{"class":105},[51,2619,2620],{"class":53,"line":1452},[51,2621,99],{"emptyLinePlaceholder":98},[51,2623,2624,2627,2629,2631,2633,2636,2638,2640,2642,2645,2647,2650,2652,2654,2656],{"class":53,"line":1477},[51,2625,2626],{"class":57},"                    boolean",[51,2628,456],{"class":455},[51,2630,460],{"class":459},[51,2632,504],{"class":91},[51,2634,2635],{"class":57},"boolean",[51,2637,398],{"class":91},[51,2639,2557],{"class":250},[51,2641,65],{"class":91},[51,2643,2644],{"class":166},"invoke",[51,2646,170],{"class":91},[51,2648,2649],{"class":442},"loginService",[51,2651,181],{"class":91},[51,2653,2562],{"class":442},[51,2655,420],{"class":91},[51,2657,1574],{"class":105},[51,2659,2660],{"class":53,"line":1482},[51,2661,99],{"emptyLinePlaceholder":98},[51,2663,2664,2667,2669,2671,2673,2675],{"class":53,"line":1487},[51,2665,2666],{"class":57},"                    if",[51,2668,504],{"class":91},[51,2670,507],{"class":459},[51,2672,510],{"class":442},[51,2674,398],{"class":91},[51,2676,152],{"class":91},[51,2678,2679,2682,2684,2686,2688,2690,2692,2694,2696,2698,2700],{"class":53,"line":1504},[51,2680,2681],{"class":250},"                        log",[51,2683,65],{"class":91},[51,2685,525],{"class":166},[51,2687,170],{"class":91},[51,2689,530],{"class":416},[51,2691,181],{"class":91},[51,2693,2562],{"class":442},[51,2695,2609],{"class":91},[51,2697,2612],{"class":879},[51,2699,2615],{"class":91},[51,2701,423],{"class":105},[51,2703,2704,2707,2709],{"class":53,"line":1525},[51,2705,2706],{"class":91},"                    }",[51,2708,547],{"class":57},[51,2710,152],{"class":91},[51,2712,2713,2715,2717,2719,2721,2723,2725,2727,2729,2731,2733],{"class":53,"line":1530},[51,2714,2681],{"class":250},[51,2716,65],{"class":91},[51,2718,411],{"class":166},[51,2720,170],{"class":91},[51,2722,563],{"class":416},[51,2724,181],{"class":91},[51,2726,2562],{"class":442},[51,2728,2609],{"class":91},[51,2730,2612],{"class":879},[51,2732,2615],{"class":91},[51,2734,423],{"class":105},[51,2736,2737],{"class":53,"line":1549},[51,2738,2739],{"class":91},"                    }\n",[51,2741,2742],{"class":53,"line":1577},[51,2743,99],{"emptyLinePlaceholder":98},[51,2745,2746,2749,2751],{"class":53,"line":1582},[51,2747,2748],{"class":57},"                    return",[51,2750,456],{"class":442},[51,2752,92],{"class":91},[51,2754,2755],{"class":53,"line":1597},[51,2756,2757],{"class":91},"                });\n",[51,2759,2760],{"class":53,"line":1618},[51,2761,99],{"emptyLinePlaceholder":98},[51,2763,2764],{"class":53,"line":1627},[51,2765,99],{"emptyLinePlaceholder":98},[51,2767,2768],{"class":53,"line":1648},[51,2769,2770],{"class":105},"        \u002F\u002F 调用代理对象\n",[51,2772,2773,2775,2777,2779,2781,2783,2785,2787,2789,2791,2793],{"class":53,"line":1653},[51,2774,452],{"class":57},[51,2776,456],{"class":455},[51,2778,460],{"class":459},[51,2780,2486],{"class":250},[51,2782,65],{"class":91},[51,2784,819],{"class":166},[51,2786,170],{"class":91},[51,2788,824],{"class":416},[51,2790,181],{"class":91},[51,2792,481],{"class":416},[51,2794,190],{"class":91},[51,2796,2797,2799,2801,2803,2805,2807,2809,2811,2813,2815],{"class":53,"line":1658},[51,2798,835],{"class":250},[51,2800,65],{"class":91},[51,2802,840],{"class":250},[51,2804,65],{"class":91},[51,2806,845],{"class":166},[51,2808,170],{"class":91},[51,2810,850],{"class":416},[51,2812,853],{"class":459},[51,2814,456],{"class":442},[51,2816,190],{"class":91},[51,2818,2819],{"class":53,"line":1667},[51,2820,593],{"class":91},[51,2822,2823],{"class":53,"line":1672},[51,2824,196],{"class":91},[27,2826,2828],{"id":2827},"cglib-动态代理","CGLIB 动态代理",[10,2830,2831],{},"1.引入 CGLIB 依赖",[40,2833,2838],{"className":2834,"code":2835,"filename":2836,"language":2837,"meta":46,"style":46},"language-xml shiki shiki-themes catppuccin-latte one-dark-pro","\u003Cdependency>\n    \u003CgroupId>cglib\u003C\u002FgroupId>\n    \u003CartifactId>cglib\u003C\u002FartifactId>\n    \u003Cversion>3.3.0\u003C\u002Fversion>\n\u003C\u002Fdependency>\n","pom.xml","xml",[48,2839,2840,2852,2873,2890,2908],{"__ignoreMap":46},[51,2841,2842,2845,2849],{"class":53,"line":54},[51,2843,2844],{"class":928},"\u003C",[51,2846,2848],{"class":2847},"sGF2L","dependency",[51,2850,2851],{"class":928},">\n",[51,2853,2854,2857,2860,2863,2866,2869,2871],{"class":53,"line":95},[51,2855,2856],{"class":928},"    \u003C",[51,2858,2859],{"class":2847},"groupId",[51,2861,2862],{"class":928},">",[51,2864,2865],{"class":442},"cglib",[51,2867,2868],{"class":928},"\u003C\u002F",[51,2870,2859],{"class":2847},[51,2872,2851],{"class":928},[51,2874,2875,2877,2880,2882,2884,2886,2888],{"class":53,"line":102},[51,2876,2856],{"class":928},[51,2878,2879],{"class":2847},"artifactId",[51,2881,2862],{"class":928},[51,2883,2865],{"class":442},[51,2885,2868],{"class":928},[51,2887,2879],{"class":2847},[51,2889,2851],{"class":928},[51,2891,2892,2894,2897,2899,2902,2904,2906],{"class":53,"line":109},[51,2893,2856],{"class":928},[51,2895,2896],{"class":2847},"version",[51,2898,2862],{"class":928},[51,2900,2901],{"class":442},"3.3.0",[51,2903,2868],{"class":928},[51,2905,2896],{"class":2847},[51,2907,2851],{"class":928},[51,2909,2910,2912,2914],{"class":53,"line":122},[51,2911,2868],{"class":928},[51,2913,2848],{"class":2847},[51,2915,2851],{"class":928},[10,2917,2918],{},"2.新建测试类",[40,2920,2922],{"className":42,"code":2921,"filename":605,"language":45,"meta":46,"style":46},"package top.dhbxs.demo.springaop.cglibproxy.service;\n\nimport lombok.extern.slf4j.Slf4j;\nimport net.sf.cglib.proxy.Enhancer;\nimport net.sf.cglib.proxy.MethodInterceptor;\nimport org.junit.jupiter.api.Test;\nimport org.springframework.boot.test.context.SpringBootTest;\n\n@Slf4j\n@SpringBootTest\nclass LoginServiceTest {\n\n    @Test\n    void login() {\n        \u002F\u002F 创建目标对象\n        LoginService loginService = new LoginService();\n\n        \u002F\u002F 创建代理对象\n        LoginService loginServiceProxy = (LoginService) Enhancer.create(\n            LoginService.class,\n            (MethodInterceptor) (proxyObj, method, argsArr, methodProxy) -> {\n                log.info(\"开始登陆\"); \u002F\u002F 日志：非核心业务代码\n                log.info(\"{} 正在登陆系统\", argsArr[0]); \u002F\u002F 日志：非核心业务代码\n                boolean flag = (boolean) method.invoke(loginService, argsArr); \u002F\u002F 调用目标对象方法\n                if (!flag) {\n                    log.error(\"{} 登陆失败\", argsArr[0]); \u002F\u002F 日志：非核心业务代码\n                } else {\n                    log.info(\"{} 登陆成功\", argsArr[0]); \u002F\u002F 日志：非核心业务代码\n                }\n                return flag;\n            });\n\n        \u002F\u002F 调用代理对象\n        boolean flag = loginServiceProxy.login(\"admin\", \"123456\");\n        System.out.println(\"flag = \" + flag);\n    }\n}\n",[48,2923,2924,2953,2957,2977,3003,3027,3051,3079,3083,3089,3095,3103,3107,3113,3123,3127,3141,3145,3149,3173,3185,3219,3236,3260,3294,3309,3333,3342,3366,3371,3380,3385,3389,3393,3417,3439,3443],{"__ignoreMap":46},[51,2925,2926,2928,2930,2932,2934,2936,2938,2940,2942,2944,2947,2949,2951],{"class":53,"line":54},[51,2927,58],{"class":57},[51,2929,61],{"class":57},[51,2931,65],{"class":64},[51,2933,68],{"class":57},[51,2935,65],{"class":64},[51,2937,73],{"class":57},[51,2939,65],{"class":64},[51,2941,78],{"class":57},[51,2943,65],{"class":64},[51,2945,2946],{"class":57},"cglibproxy",[51,2948,65],{"class":64},[51,2950,88],{"class":57},[51,2952,92],{"class":91},[51,2954,2955],{"class":53,"line":95},[51,2956,99],{"emptyLinePlaceholder":98},[51,2958,2959,2961,2963,2965,2967,2969,2971,2973,2975],{"class":53,"line":102},[51,2960,247],{"class":57},[51,2962,251],{"class":250},[51,2964,65],{"class":254},[51,2966,257],{"class":250},[51,2968,65],{"class":254},[51,2970,262],{"class":250},[51,2972,65],{"class":254},[51,2974,267],{"class":250},[51,2976,92],{"class":91},[51,2978,2979,2981,2984,2986,2989,2991,2993,2995,2997,2999,3001],{"class":53,"line":109},[51,2980,247],{"class":57},[51,2982,2983],{"class":250}," net",[51,2985,65],{"class":254},[51,2987,2988],{"class":250},"sf",[51,2990,65],{"class":254},[51,2992,2865],{"class":250},[51,2994,65],{"class":254},[51,2996,1223],{"class":250},[51,2998,65],{"class":254},[51,3000,2216],{"class":250},[51,3002,92],{"class":91},[51,3004,3005,3007,3009,3011,3013,3015,3017,3019,3021,3023,3025],{"class":53,"line":122},[51,3006,247],{"class":57},[51,3008,2983],{"class":250},[51,3010,65],{"class":254},[51,3012,2988],{"class":250},[51,3014,65],{"class":254},[51,3016,2865],{"class":250},[51,3018,65],{"class":254},[51,3020,1223],{"class":250},[51,3022,65],{"class":254},[51,3024,2221],{"class":250},[51,3026,92],{"class":91},[51,3028,3029,3031,3033,3035,3037,3039,3041,3043,3045,3047,3049],{"class":53,"line":133},[51,3030,247],{"class":57},[51,3032,646],{"class":250},[51,3034,65],{"class":254},[51,3036,651],{"class":250},[51,3038,65],{"class":254},[51,3040,656],{"class":250},[51,3042,65],{"class":254},[51,3044,661],{"class":250},[51,3046,65],{"class":254},[51,3048,666],{"class":250},[51,3050,92],{"class":91},[51,3052,3053,3055,3057,3059,3061,3063,3065,3067,3069,3071,3073,3075,3077],{"class":53,"line":139},[51,3054,247],{"class":57},[51,3056,646],{"class":250},[51,3058,65],{"class":254},[51,3060,679],{"class":250},[51,3062,65],{"class":254},[51,3064,684],{"class":250},[51,3066,65],{"class":254},[51,3068,689],{"class":250},[51,3070,65],{"class":254},[51,3072,694],{"class":250},[51,3074,65],{"class":254},[51,3076,699],{"class":250},[51,3078,92],{"class":91},[51,3080,3081],{"class":53,"line":155},[51,3082,99],{"emptyLinePlaceholder":98},[51,3084,3085,3087],{"class":53,"line":160},[51,3086,336],{"class":335},[51,3088,340],{"class":339},[51,3090,3091,3093],{"class":53,"line":193},[51,3092,336],{"class":335},[51,3094,749],{"class":339},[51,3096,3097,3099,3101],{"class":53,"line":343},[51,3098,754],{"class":57},[51,3100,757],{"class":148},[51,3102,152],{"class":91},[51,3104,3105],{"class":53,"line":361},[51,3106,99],{"emptyLinePlaceholder":98},[51,3108,3109,3111],{"class":53,"line":366},[51,3110,369],{"class":335},[51,3112,770],{"class":339},[51,3114,3115,3117,3119,3121],{"class":53,"line":375},[51,3116,775],{"class":57},[51,3118,167],{"class":166},[51,3120,780],{"class":91},[51,3122,152],{"class":91},[51,3124,3125],{"class":53,"line":403},[51,3126,2456],{"class":105},[51,3128,3129,3131,3133,3135,3137,3139],{"class":53,"line":426},[51,3130,787],{"class":173},[51,3132,790],{"class":455},[51,3134,460],{"class":459},[51,3136,795],{"class":57},[51,3138,149],{"class":166},[51,3140,800],{"class":91},[51,3142,3143],{"class":53,"line":449},[51,3144,99],{"emptyLinePlaceholder":98},[51,3146,3147],{"class":53,"line":498},[51,3148,2479],{"class":105},[51,3150,3151,3153,3155,3157,3159,3161,3163,3166,3168,3171],{"class":53,"line":517},[51,3152,787],{"class":173},[51,3154,2486],{"class":455},[51,3156,460],{"class":459},[51,3158,504],{"class":91},[51,3160,300],{"class":442},[51,3162,398],{"class":91},[51,3164,3165],{"class":250}," Enhancer",[51,3167,65],{"class":91},[51,3169,3170],{"class":166},"create",[51,3172,2505],{"class":91},[51,3174,3175,3178,3180,3182],{"class":53,"line":541},[51,3176,3177],{"class":250},"            LoginService",[51,3179,65],{"class":91},[51,3181,754],{"class":250},[51,3183,3184],{"class":91},",\n",[51,3186,3187,3190,3192,3194,3196,3199,3201,3203,3205,3208,3210,3213,3215,3217],{"class":53,"line":552},[51,3188,3189],{"class":91},"            (",[51,3191,2221],{"class":442},[51,3193,398],{"class":91},[51,3195,504],{"class":91},[51,3197,3198],{"class":442},"proxyObj",[51,3200,181],{"class":91},[51,3202,2557],{"class":442},[51,3204,181],{"class":91},[51,3206,3207],{"class":442}," argsArr",[51,3209,181],{"class":91},[51,3211,3212],{"class":442}," methodProxy",[51,3214,398],{"class":91},[51,3216,2567],{"class":57},[51,3218,152],{"class":91},[51,3220,3221,3224,3226,3228,3230,3232,3234],{"class":53,"line":574},[51,3222,3223],{"class":250},"                log",[51,3225,65],{"class":91},[51,3227,411],{"class":166},[51,3229,170],{"class":91},[51,3231,417],{"class":416},[51,3233,420],{"class":91},[51,3235,423],{"class":105},[51,3237,3238,3240,3242,3244,3246,3248,3250,3252,3254,3256,3258],{"class":53,"line":580},[51,3239,3223],{"class":250},[51,3241,65],{"class":91},[51,3243,411],{"class":166},[51,3245,170],{"class":91},[51,3247,437],{"class":416},[51,3249,181],{"class":91},[51,3251,3207],{"class":442},[51,3253,2609],{"class":91},[51,3255,2612],{"class":879},[51,3257,2615],{"class":91},[51,3259,423],{"class":105},[51,3261,3262,3265,3267,3269,3271,3273,3275,3277,3279,3281,3283,3285,3287,3289,3291],{"class":53,"line":590},[51,3263,3264],{"class":57},"                boolean",[51,3266,456],{"class":455},[51,3268,460],{"class":459},[51,3270,504],{"class":91},[51,3272,2635],{"class":57},[51,3274,398],{"class":91},[51,3276,2557],{"class":250},[51,3278,65],{"class":91},[51,3280,2644],{"class":166},[51,3282,170],{"class":91},[51,3284,2649],{"class":442},[51,3286,181],{"class":91},[51,3288,3207],{"class":442},[51,3290,420],{"class":91},[51,3292,3293],{"class":105}," \u002F\u002F 调用目标对象方法\n",[51,3295,3296,3299,3301,3303,3305,3307],{"class":53,"line":596},[51,3297,3298],{"class":57},"                if",[51,3300,504],{"class":91},[51,3302,507],{"class":459},[51,3304,510],{"class":442},[51,3306,398],{"class":91},[51,3308,152],{"class":91},[51,3310,3311,3313,3315,3317,3319,3321,3323,3325,3327,3329,3331],{"class":53,"line":1452},[51,3312,2578],{"class":250},[51,3314,65],{"class":91},[51,3316,525],{"class":166},[51,3318,170],{"class":91},[51,3320,530],{"class":416},[51,3322,181],{"class":91},[51,3324,3207],{"class":442},[51,3326,2609],{"class":91},[51,3328,2612],{"class":879},[51,3330,2615],{"class":91},[51,3332,423],{"class":105},[51,3334,3335,3338,3340],{"class":53,"line":1477},[51,3336,3337],{"class":91},"                }",[51,3339,547],{"class":57},[51,3341,152],{"class":91},[51,3343,3344,3346,3348,3350,3352,3354,3356,3358,3360,3362,3364],{"class":53,"line":1482},[51,3345,2578],{"class":250},[51,3347,65],{"class":91},[51,3349,411],{"class":166},[51,3351,170],{"class":91},[51,3353,563],{"class":416},[51,3355,181],{"class":91},[51,3357,3207],{"class":442},[51,3359,2609],{"class":91},[51,3361,2612],{"class":879},[51,3363,2615],{"class":91},[51,3365,423],{"class":105},[51,3367,3368],{"class":53,"line":1487},[51,3369,3370],{"class":91},"                }\n",[51,3372,3373,3376,3378],{"class":53,"line":1504},[51,3374,3375],{"class":57},"                return",[51,3377,456],{"class":442},[51,3379,92],{"class":91},[51,3381,3382],{"class":53,"line":1525},[51,3383,3384],{"class":91},"            });\n",[51,3386,3387],{"class":53,"line":1530},[51,3388,99],{"emptyLinePlaceholder":98},[51,3390,3391],{"class":53,"line":1549},[51,3392,2770],{"class":105},[51,3394,3395,3397,3399,3401,3403,3405,3407,3409,3411,3413,3415],{"class":53,"line":1577},[51,3396,452],{"class":57},[51,3398,456],{"class":455},[51,3400,460],{"class":459},[51,3402,2486],{"class":250},[51,3404,65],{"class":91},[51,3406,819],{"class":166},[51,3408,170],{"class":91},[51,3410,824],{"class":416},[51,3412,181],{"class":91},[51,3414,481],{"class":416},[51,3416,190],{"class":91},[51,3418,3419,3421,3423,3425,3427,3429,3431,3433,3435,3437],{"class":53,"line":1582},[51,3420,835],{"class":250},[51,3422,65],{"class":91},[51,3424,840],{"class":250},[51,3426,65],{"class":91},[51,3428,845],{"class":166},[51,3430,170],{"class":91},[51,3432,850],{"class":416},[51,3434,853],{"class":459},[51,3436,456],{"class":442},[51,3438,190],{"class":91},[51,3440,3441],{"class":53,"line":1597},[51,3442,593],{"class":91},[51,3444,3445],{"class":53,"line":1618},[51,3446,196],{"class":91},[10,3448,3449,3450,3453],{},"3.添加 jvm 参数 ",[48,3451,3452],{"code":3452},"--add-opens java.base\u002Fjava.lang=ALL-UNNAMED","，因为 JDK9 开始为了增强安全性，引入了模块系统（JPMS）对反射做了严格限制。CGLIB 尝试通过反射调用 ClassLoader.defineClass() 方法来动态生成类，但该方法属于 java.lang 包且未被暴露给“未命名模块”（即你的普通 Java 项目）。所以在不加上面的 jvm 参数时会报如下错误：",[40,3455,3457],{"className":42,"code":3456,"filename":872,"language":45,"meta":46,"style":46},"Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(...) accessible:\nmodule java.base does not \"opens java.lang\" to unnamed module\n",[48,3458,3459,3509],{"__ignoreMap":46},[51,3460,3461,3464,3467,3470,3473,3475,3477,3479,3481,3484,3486,3488,3490,3492,3495,3497,3500,3503,3506],{"class":53,"line":54},[51,3462,3463],{"class":173},"Unable",[51,3465,3466],{"class":455}," to make ",[51,3468,3469],{"class":57},"protected",[51,3471,3472],{"class":57}," final",[51,3474,2391],{"class":250},[51,3476,65],{"class":91},[51,3478,2396],{"class":250},[51,3480,65],{"class":91},[51,3482,3483],{"class":250},"Class",[51,3485,2391],{"class":250},[51,3487,65],{"class":91},[51,3489,2396],{"class":250},[51,3491,65],{"class":91},[51,3493,3494],{"class":250},"ClassLoader",[51,3496,65],{"class":91},[51,3498,3499],{"class":166},"defineClass",[51,3501,3502],{"class":91},"(...)",[51,3504,3505],{"class":455}," accessible",[51,3507,3508],{"class":57},":\n",[51,3510,3511,3514,3516],{"class":53,"line":95},[51,3512,3513],{"class":57},"module",[51,3515,2391],{"class":148},[51,3517,3518],{"class":455},".base does not \"opens java.lang\" to unnamed module\n",[10,3520,3521],{},"4.执行结果",[40,3523,3525],{"className":42,"code":3524,"filename":872,"language":45,"meta":46,"style":46},"2026-04-19T23:36:10.364+08:00  INFO 15380 --- [SpringAOP] [           main] t.d.d.s.c.service.LoginServiceTest       : 开始登陆\n2026-04-19T23:36:10.365+08:00  INFO 15380 --- [SpringAOP] [           main] t.d.d.s.c.service.LoginServiceTest       : admin 正在登陆系统\n2026-04-19T23:36:10.367+08:00  INFO 15380 --- [SpringAOP] [           main] t.d.d.s.c.service.LoginServiceTest       : admin 登陆成功\nflag = true\n",[48,3526,3527,3612,3691,3770],{"__ignoreMap":46},[51,3528,3529,3531,3533,3535,3537,3540,3542,3545,3547,3550,3552,3554,3556,3558,3560,3563,3565,3567,3569,3571,3573,3575,3577,3579,3581,3583,3585,3587,3589,3591,3593,3595,3598,3600,3602,3604,3607,3610],{"class":53,"line":54},[51,3530,880],{"class":879},[51,3532,883],{"class":459},[51,3534,886],{"class":879},[51,3536,883],{"class":459},[51,3538,3539],{"class":455},"19T23",[51,3541,894],{"class":57},[51,3543,3544],{"class":879},"36",[51,3546,894],{"class":57},[51,3548,3549],{"class":879},"10.364",[51,3551,911],{"class":459},[51,3553,914],{"class":455},[51,3555,894],{"class":57},[51,3557,919],{"class":879},[51,3559,922],{"class":455},[51,3561,3562],{"class":879},"15380",[51,3564,929],{"class":928},[51,3566,883],{"class":459},[51,3568,935],{"class":934},[51,3570,938],{"class":455},[51,3572,941],{"class":934},[51,3574,935],{"class":934},[51,3576,946],{"class":455},[51,3578,941],{"class":934},[51,3580,951],{"class":250},[51,3582,65],{"class":91},[51,3584,956],{"class":250},[51,3586,65],{"class":91},[51,3588,956],{"class":250},[51,3590,65],{"class":91},[51,3592,965],{"class":250},[51,3594,65],{"class":91},[51,3596,3597],{"class":250},"c",[51,3599,65],{"class":91},[51,3601,88],{"class":250},[51,3603,65],{"class":91},[51,3605,3606],{"class":250},"LoginServiceTest",[51,3608,3609],{"class":57},"       :",[51,3611,987],{"class":455},[51,3613,3614,3616,3618,3620,3622,3624,3626,3628,3630,3633,3635,3637,3639,3641,3643,3645,3647,3649,3651,3653,3655,3657,3659,3661,3663,3665,3667,3669,3671,3673,3675,3677,3679,3681,3683,3685,3687,3689],{"class":53,"line":95},[51,3615,880],{"class":879},[51,3617,883],{"class":459},[51,3619,886],{"class":879},[51,3621,883],{"class":459},[51,3623,3539],{"class":455},[51,3625,894],{"class":57},[51,3627,3544],{"class":879},[51,3629,894],{"class":57},[51,3631,3632],{"class":879},"10.365",[51,3634,911],{"class":459},[51,3636,914],{"class":455},[51,3638,894],{"class":57},[51,3640,919],{"class":879},[51,3642,922],{"class":455},[51,3644,3562],{"class":879},[51,3646,929],{"class":928},[51,3648,883],{"class":459},[51,3650,935],{"class":934},[51,3652,938],{"class":455},[51,3654,941],{"class":934},[51,3656,935],{"class":934},[51,3658,946],{"class":455},[51,3660,941],{"class":934},[51,3662,951],{"class":250},[51,3664,65],{"class":91},[51,3666,956],{"class":250},[51,3668,65],{"class":91},[51,3670,956],{"class":250},[51,3672,65],{"class":91},[51,3674,965],{"class":250},[51,3676,65],{"class":91},[51,3678,3597],{"class":250},[51,3680,65],{"class":91},[51,3682,88],{"class":250},[51,3684,65],{"class":91},[51,3686,3606],{"class":250},[51,3688,3609],{"class":57},[51,3690,1074],{"class":455},[51,3692,3693,3695,3697,3699,3701,3703,3705,3707,3709,3712,3714,3716,3718,3720,3722,3724,3726,3728,3730,3732,3734,3736,3738,3740,3742,3744,3746,3748,3750,3752,3754,3756,3758,3760,3762,3764,3766,3768],{"class":53,"line":102},[51,3694,880],{"class":879},[51,3696,883],{"class":459},[51,3698,886],{"class":879},[51,3700,883],{"class":459},[51,3702,3539],{"class":455},[51,3704,894],{"class":57},[51,3706,3544],{"class":879},[51,3708,894],{"class":57},[51,3710,3711],{"class":879},"10.367",[51,3713,911],{"class":459},[51,3715,914],{"class":455},[51,3717,894],{"class":57},[51,3719,919],{"class":879},[51,3721,922],{"class":455},[51,3723,3562],{"class":879},[51,3725,929],{"class":928},[51,3727,883],{"class":459},[51,3729,935],{"class":934},[51,3731,938],{"class":455},[51,3733,941],{"class":934},[51,3735,935],{"class":934},[51,3737,946],{"class":455},[51,3739,941],{"class":934},[51,3741,951],{"class":250},[51,3743,65],{"class":91},[51,3745,956],{"class":250},[51,3747,65],{"class":91},[51,3749,956],{"class":250},[51,3751,65],{"class":91},[51,3753,965],{"class":250},[51,3755,65],{"class":91},[51,3757,3597],{"class":250},[51,3759,65],{"class":91},[51,3761,88],{"class":250},[51,3763,65],{"class":91},[51,3765,3606],{"class":250},[51,3767,3609],{"class":57},[51,3769,1162],{"class":455},[51,3771,3772,3774,3776],{"class":53,"line":109},[51,3773,1167],{"class":455},[51,3775,1170],{"class":459},[51,3777,1174],{"class":1173},[23,3779,3780],{"id":3780},"总结",[3782,3783,3784,3798],"table",{},[3785,3786,3787],"thead",{},[3788,3789,3790,3794,3796],"tr",{},[3791,3792,3793],"th",{},"特性",[3791,3795,2228],{},[3791,3797,2828],{},[3799,3800,3801,3813,3824,3835],"tbody",{},[3788,3802,3803,3807,3810],{},[3804,3805,3806],"td",{},"依赖条件",[3804,3808,3809],{},"目标类必须实现接口",[3804,3811,3812],{},"目标类无需实现接口",[3788,3814,3815,3818,3821],{},[3804,3816,3817],{},"实现方式",[3804,3819,3820],{},"实现与目标类相同的接口",[3804,3822,3823],{},"继承目标类",[3788,3825,3826,3829,3832],{},[3804,3827,3828],{},"核心 API",[3804,3830,3831],{},"Proxy + InvocationHandler",[3804,3833,3834],{},"Enhancer + MethodInterceptor",[3788,3836,3837,3840,3843],{},[3804,3838,3839],{},"Spring AOP 适配",[3804,3841,3842],{},"目标类有接口时默认使用",[3804,3844,3845],{},"目标类无接口时自动切换使用",[3847,3848,3849],"style",{},"html pre.shiki code .sSWcl, html code.shiki .sSWcl{--shiki-default:#8839EF;--shiki-dark:#C678DD}html pre.shiki code .sHUla, html code.shiki .sHUla{--shiki-default:#7C7F93;--shiki-dark:#C678DD}html pre.shiki code .sgT6j, html code.shiki .sgT6j{--shiki-default:#7C7F93;--shiki-dark:#ABB2BF}html pre.shiki code .skYY2, html code.shiki .skYY2{--shiki-default:#7C7F93;--shiki-default-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic}html pre.shiki code .szsGz, html code.shiki .szsGz{--shiki-default:#8839EF;--shiki-default-font-style:inherit;--shiki-dark:#C678DD;--shiki-dark-font-style:italic}html pre.shiki code .sIkkJ, html code.shiki .sIkkJ{--shiki-default:#DF8E1D;--shiki-default-font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:inherit}html pre.shiki code .seVD2, html code.shiki .seVD2{--shiki-default:#1E66F5;--shiki-default-font-style:italic;--shiki-dark:#61AFEF;--shiki-dark-font-style:inherit}html pre.shiki code .sPahJ, html code.shiki .sPahJ{--shiki-default:#8839EF;--shiki-dark:#E5C07B}html pre.shiki code .sddMY, html code.shiki .sddMY{--shiki-default:#E64553;--shiki-default-font-style:italic;--shiki-dark:#E06C75;--shiki-dark-font-style:italic}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szf8G, html code.shiki .szf8G{--shiki-default:#4C4F69;--shiki-dark:#E5C07B}html pre.shiki code .sGc2n, html code.shiki .sGc2n{--shiki-default:#7C7F93;--shiki-dark:#E5C07B}html pre.shiki code .slb6Y, html code.shiki .slb6Y{--shiki-default:#FE640B;--shiki-dark:#ABB2BF}html pre.shiki code .saiVi, html code.shiki .saiVi{--shiki-default:#FE640B;--shiki-dark:#E5C07B}html pre.shiki code .sw_MA, html code.shiki .sw_MA{--shiki-default:#40A02B;--shiki-dark:#98C379}html pre.shiki code .sa2x1, html code.shiki .sa2x1{--shiki-default:#4C4F69;--shiki-dark:#ABB2BF}html pre.shiki code .sIGPt, html code.shiki .sIGPt{--shiki-default:#4C4F69;--shiki-dark:#E06C75}html pre.shiki code .sqgB4, html code.shiki .sqgB4{--shiki-default:#179299;--shiki-dark:#56B6C2}html pre.shiki code .sYQis, html code.shiki .sYQis{--shiki-default:#FE640B;--shiki-dark:#D19A66}html pre.shiki code .s3HXw, html code.shiki .s3HXw{--shiki-default:#4C4F69;--shiki-dark:#FFFFFF}html pre.shiki code .sxizN, html code.shiki .sxizN{--shiki-default:#179299;--shiki-dark:#ABB2BF}html pre.shiki code .syBBb, html code.shiki .syBBb{--shiki-default:#7C7F93;--shiki-dark:#E06C75}html pre.shiki code .sFiMs, html code.shiki .sFiMs{--shiki-default:#D20F39;--shiki-dark:#D19A66}html pre.shiki code .sGF2L, html code.shiki .sGF2L{--shiki-default:#1E66F5;--shiki-dark:#E06C75}",{"title":46,"searchDepth":109,"depth":109,"links":3851},[3852,3856,3860],{"id":25,"depth":95,"text":25,"children":3853},[3854,3855],{"id":29,"depth":102,"text":29},{"id":1183,"depth":102,"text":1183},{"id":2166,"depth":95,"text":2166,"children":3857},[3858,3859],{"id":2227,"depth":102,"text":2228},{"id":2827,"depth":102,"text":2828},{"id":3780,"depth":95,"text":3780},[3862],"技术","2026-04-20 11:18:07","用日志和业务逻辑解耦的案例，从静态代理的手动编码痛点出发，逐步演进至JDK动态代理与CGLIB字节码增强，对比两种机制的底层实现差异与适用场景，深入理解Spring AOP底层的实现方式。",false,"md","https:\u002F\u002Ffile.dhbxs.top\u002Fblog_img\u002F1776615019347_dtdl.webp",{"slots":3869},{},"\u002Fposts\u002F370adf0",null,{"text":3873,"minutes":3874,"time":3875,"words":3876},"10 min read",9.39,563400,1878,{"title":5,"description":3864},{"loc":3870},"posts\u002F2026\u002FSpring AOP 动态代理机制：从静态代理到 JDK 与 CGLIB 的实现",[3881,3882],"Spring","Java","tech","6PYJSUa5RcgFdpNuzYrYrtCP7kqxYXDYiHELDHmXTTg",[3886,3871],{"title":3887,"path":3888,"stem":3889,"date":3890,"type":3883,"children":-1},"从零手写一个 Spring Boot Starter：深入理解自动装配原理","\u002Fposts\u002F7dc99e0","posts\u002F2026\u002F从零手写一个 Spring Boot Starter：深入理解自动装配原理","2026-04-09 07:13:41",1776667779442]