Spring基礎之AOP程式設計
阿新 • • 發佈:2021-01-22
技術標籤:Spring學習筆記springaop
文章目錄
前言
AOP程式設計也叫作面向切面程式設計,底層採用的是代理機制實現的。在Spring中,目標類有介面,也有類的時候,spring底層用動態代理實現;如果目標類只有類,spring底層用cglib實現。本篇筆記主要記錄了通過工廠bean代理和AOP的簡單案例。
一、AOP聯盟通知型別
- 前置通知 org.springframework.aop.MethodBeforeAdvice — 在目標方法執行前實施增強
- 後置通知 org.springframework.aop.AfterReturningAdvice — 在目標方法執行後實施增強
- 環繞通知 org.aopalliance.intercept.MethodInterceptor — 在目標方法執行前後實施增強
- 異常丟擲通知 org.springframework.aop.ThrowsAdvice — 在方法丟擲異常後實施增強
- 引介通知 org.springframework.aop.IntroductionInterceptor — 在目標類中新增一些新的方法和屬性
二、工廠bean代理
<需要aop聯盟的jar包 – aopalliance;spring-aop實現>
1.目標類
public class UserServiceImpl implements UserService {
@Override
public void addUser() {
System.out.println("add user");
}
}
2.切面類
確定通知,需要實現不同介面,環繞通知 — MethodInterceptor
public class MyAspect implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
System.out.println("前");
//手動執行目標方法
Object object = methodInvocation.proceed();
System.out.println("後");
return object;
}
}
3.Spring配置
<bean id="userService" class="com.spr.factorybean.UserServiceImpl"></bean>
<bean id="myAspect" class="com.spr.factorybean.MyAspect"></bean>
<bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="interfaces" value="com.spr.factorybean.UserService"></property>
<property name="target" ref="userService"></property>
<property name="interceptorNames" value="myAspect"></property>
</bean>
4.測試類
public void func(){
String xmlpath = "bean.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlpath);
UserService userService = (UserService) applicationContext.getBean("proxyService"); //獲取的是代理bean
userService.addUser();
}
測試類的執行結果如下:
三、aop程式設計
由spring自動生成代理,只需要目標類
1.目標類
public class UserServiceImpl implements UserService {
@Override
public void addUser() {
System.out.println("aop add user");
}
}
2.切面類
確定通知,需要實現不同介面,環繞通知 — MethodInterceptor
public class MyAspect implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
System.out.println("前");
//手動執行目標方法
Object object = methodInvocation.proceed();
System.out.println("後");
return object;
}
}
3.Spring配置
<bean id="userService" class="com.spr.aopdemo.UserServiceImpl"></bean>
<bean id="myAspect" class="com.spr.aopdemo.MyAspect"></bean>
<aop:config >
<aop:pointcut expression="execution(* com.spr.aopdemo.*.*(..))" id="myPointCut"/>
<aop:advisor advice-ref="myAspect" pointcut-ref="myPointCut"/>
</aop:config>
4.測試類
public void func(){
String xmlpath = "bean.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlpath);
UserService userService = (UserService) applicationContext.getBean("userService");
userService.addUser();
}
總結
本篇主要記錄了AOP的簡單案例,AOP和工廠bean的主要區別其實也就是在Spring的配置上,工廠bean需要建立一個代理bean,並且使用的時候(在測試類中)獲取的也是代理,而AOP不需要建立這樣的一個代理bean,建立的這個過程是由Spring去完成的,所以AOP是一個全自動的,而工廠bean只能看做是半自動的。