Spring AOP手動(dòng)實(shí)現(xiàn)簡(jiǎn)單動(dòng)態(tài)代理的代碼
什么是AOP我們先來(lái)看一張圖

圖中A就是通知,比如你要給每個(gè)方法前都加一個(gè)before()方法,目標(biāo)類(lèi)的每一個(gè)方法叫joinpoint(切入點(diǎn)),每個(gè)切入點(diǎn)都會(huì)用到通知,把通知和切入點(diǎn)連起來(lái),點(diǎn)成線,線成面,這就是切面,也就是AOP,下面我們來(lái)簡(jiǎn)單寫(xiě)個(gè)小例子來(lái)實(shí)現(xiàn)一下
目標(biāo)類(lèi)的接口
public interface UserService {
public void addUser() ;
public void updateUser();
public void deleteUser();
}
目標(biāo)類(lèi)接口的實(shí)現(xiàn)
public class UserServiceImpl implements UserService {
@Override
public void addUser() {
System.out.println("addUser");
}
@Override
public void updateUser() {
System.out.println("updateUser");
}
@Override
public void deleteUser() {
System.out.println("deleteUser");
}
}
通知類(lèi)
public class MyAspect {
public void before(){
System.out.println("before");
}
public void after(){
System.out.println("after");
}
}
代理類(lèi)
public class MyBeanFactory {
public static UserService createService(){
//1.目標(biāo)類(lèi)
final UserService userService = new UserServiceImpl() ;
//2.切面類(lèi)
final MyAspect myAspect = new MyAspect();
// 切入點(diǎn)和切面類(lèi)結(jié)合
// 三個(gè)參數(shù)
// 1. loader ,類(lèi)加載器 運(yùn)行是加載,用類(lèi)加載器將其加載到內(nèi)存
// 2. interfaces 代理類(lèi)需要實(shí)現(xiàn)的所有接口
// 3. invocationHandler 處理類(lèi),一般采用匿名內(nèi)部類(lèi)
// 提供了invoke方法 代理類(lèi)每個(gè)方法執(zhí)行時(shí)都將調(diào)用一次invoke ,又有三個(gè)參數(shù)
// 1. Object proxy 代理對(duì)象
// 2. Method method 代理對(duì)象方法的反射
// 3. Object[] args 方法的實(shí)際參數(shù)
UserService proxyService = (UserService) Proxy.newProxyInstance(MyBeanFactory.class.getClassLoader(),
userService.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName());
myAspect.before();
Object obj = method.invoke(userService, args);
myAspect.after();
return obj ;
}
});
return proxyService ;
}
}
測(cè)試類(lèi)
public class UserServiceImplTest {
@org.junit.jupiter.api.Test
public void demo() throws Exception {
UserService userService = MyBeanFactory.createService();
userService.addUser();
userService.deleteUser();
userService.updateUser();
}
}
結(jié)果
addUser
before
addUser
after
deleteUser
before
deleteUser
after
updateUser
before
updateUser
after
Process finished with exit code 0
我們可以看到每個(gè)方法都執(zhí)行了通知,用了動(dòng)態(tài)代理就不用手動(dòng)的給每個(gè)方法前后加入通知,這樣既節(jié)省了時(shí)間,也保證了主體代碼不被改變
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
Spring Security使用中Preflight請(qǐng)求和跨域問(wèn)題詳解
這篇文章主要給大家介紹了關(guān)于Spring Security使用中Preflight請(qǐng)求和跨域問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
解析spring-security權(quán)限控制和校驗(yàn)的問(wèn)題
這篇文章主要介紹了解析spring-security權(quán)限控制和校驗(yàn)的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
SpringMVC響應(yīng)視圖和結(jié)果視圖詳解
這篇文章主要介紹了SpringMVC響應(yīng)視圖和結(jié)果視圖,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
SpringBoot中注冊(cè)Bean的方式總結(jié)
這篇文章主要介紹了SpringBoot中注冊(cè)Bean的方式總結(jié),@ComponentScan + @Componet相關(guān)注解,@Bean,@Import和spring.factories這四種方式,文中代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04
Java中的volatile實(shí)現(xiàn)機(jī)制詳細(xì)解析
這篇文章主要介紹了Java中的volatile實(shí)現(xiàn)機(jī)制詳細(xì)解析,本文的主要內(nèi)容就在于要理解volatile的緩存的一致性協(xié)議導(dǎo)致的共享變量可見(jiàn)性,以及volatile在解析成為匯編語(yǔ)言的時(shí)候?qū)ψ兞考渔i兩塊理論內(nèi)容,需要的朋友可以參考下2024-01-01
Java實(shí)現(xiàn)音頻添加自定義時(shí)長(zhǎng)靜音的示例代碼
這篇文章主要介紹了一個(gè)Java工具類(lèi),可以實(shí)現(xiàn)給一個(gè)wav音頻添加自定義時(shí)長(zhǎng)靜音。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下2022-01-01
網(wǎng)關(guān)Gateway過(guò)濾器的使用詳解
Gateway網(wǎng)關(guān)的過(guò)濾器分為兩種,一種是局部過(guò)濾器,一種是全局過(guò)濾器,過(guò)濾器就是過(guò)濾一些請(qǐng)求,在這里,全局過(guò)濾器的作用是處理一切進(jìn)入網(wǎng)關(guān)的請(qǐng)求和微服務(wù)響應(yīng),與GatewayFilter的作用一樣,本文給大家介紹網(wǎng)關(guān)Gateway過(guò)濾器的使用,感興趣的朋友一起看看吧2022-07-07
解決Eclipse配置Tomcat出現(xiàn)Cannot create a server using the selected
這篇文章主要介紹了解決Eclipse配置Tomcat出現(xiàn)Cannot create a server using the selected type錯(cuò)誤的相關(guān)資料,需要的朋友可以參考下2017-02-02
Java并發(fā)編程之CountDownLatch源碼解析
這篇文章主要介紹了Java并發(fā)編程之CountDownLatch源碼解析,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java并發(fā)編程的小伙伴們有很好的幫助,需要的朋友可以參考下2021-04-04

