xml aop:config方式實現(xiàn)AOP(第四種)
public interface IUserService {
? ? /**
? ? * 獲取所有的用戶對象列表
? ? * @return
? ? */
? ? List<Object> getAllUser();
? ? /**
? ? * 保存用戶
? ? * @param user
? ? * @return
? ? */
? ? boolean saveUser(Object user);
? ? /**
? ? * 根據(jù)用戶uid刪除該uid對應(yīng)的用戶信息
? ? * @param uid
? ? * @return
? ? */
? ? boolean deleteUser(int uid);
? ? /**
? ? * 更新指定用戶信息
? ? * @param obj
? ? * @return
? ? */
? ? boolean updateUser(Object obj);
}
配置beans文件
<!--
? ? ? ? proxy-target-class設(shè)置為true,強制使用cglib方式來實現(xiàn)動態(tài)代理
? ? -->
? ? <aop:config proxy-target-class="true">
? ? ? ? <!--
? ? ? ? ? ? 定義一個aop的切點
? ? ? ? ? ? 該包com.qfedu.aop04下所有的任意類,類下的任意含參不含參數(shù)的方法,返回值必須為List的方法將會被代理
? ? ? ? ? ? <aop:pointcut id="pt" expression="execution(java.util.List com.qfedu.aop04.*.*(..))" />
? ? ? ? ? ? 該包com.qfedu.aop04下所有的任意類子眶,類下的任意含參不含參數(shù)的方法,返回值必須為boolean的方法將會被代理
? ? ? ? ? ? <aop:pointcut id="pt" expression="execution(boolean com.qfedu.aop04.*.*(..))" />
? ? ? ? ? ? com.qfedu.aop04.UserServiceImpl.deleteUser(int)具體的方法了见咒,參數(shù)為int衷模,返回值任意
? ? ? ? ? ? <aop:pointcut id="pt" expression="execution(* com.qfedu.aop04.UserServiceImpl.deleteUser(int))" />
? ? ? ? ? ? 多個條件
? ? ? ? ? ? <aop:pointcut id="pt" expression="(execution(boolean com.qfedu.aop04.*.*(..)) or (execution(java.util.List com.qfedu.aop04.*.*(..))))" />
? ? ? ? -->
? ? ? ? <aop:pointcut id="pt" expression="(execution(boolean com.qfedu.aop04.*.*(..)) or (execution(java.util.List com.qfedu.aop04.*.*(..))))" />
? ? ? ? <!--
? ? ? ? ? ? 通知泉孩,將MyAspect與切點關(guān)聯(lián)起來
? ? ? ? -->
? ? ? ? <aop:advisor advice-ref="ma" pointcut-ref="pt" />
? ? </aop:config>
</beans>
AOP的第五種實現(xiàn)方式-xml通知(第五種)
/**
* 五種通知方式來實現(xiàn)aop
*? 1. 前置通知芯砸,在業(yè)務(wù)方法之前執(zhí)行
*? 2. 后置通知萧芙,在業(yè)務(wù)方法之后執(zhí)行
*? 3. 環(huán)繞通知,同時在業(yè)務(wù)方法的前后執(zhí)行
*? 4. 帶有返回值通知假丧,可以拿到業(yè)務(wù)方法的返回值
*? 5. 異常通知双揪,可以捕獲業(yè)務(wù)方法中的異常對象
*
*? ? ? 注意:如果同時配置來所有的通知方式,則執(zhí)行順序依次為:
*? ? ? ? ? before>around before>業(yè)務(wù)方法 >after returning > around after > after
*? ? ? ? ? before>around before>業(yè)務(wù)方法 >after throwing >? after
*
*? ? ? ? ? ps. 使用注解的話是環(huán)繞通知proceed方法之前部分先執(zhí)行包帚,使用xml配置的話取決于aop:before和aop:around的配置順序
*/
public interface IUserService {
? ? /**
? ? * 獲取所有的用戶對象列表
? ? * @return
? ? */
? ? List<Object> getAllUser();
? ? /**
? ? * 保存用戶
? ? * @param user
? ? * @return
? ? */
? ? boolean saveUser(Object user);
? ? /**
? ? * 根據(jù)用戶uid刪除該uid對應(yīng)的用戶信息
? ? * @param uid
? ? * @return
? ? */
? ? boolean deleteUser(int uid);
? ? /**
? ? * 更新指定用戶信息
? ? * @param obj
? ? * @return
? ? */
? ? boolean updateUser(Object obj);
? ? void getUserByUid();
}
beans文件配置
AOP的第六種實現(xiàn)方式:自動代理 (第六種)
import java.util.List;
public interface IUserService {
? ? /**
? ? * 獲取所有的用戶對象列表
? ? * @return
? ? */
? ? List<Object> getAllUser();
? ? /**
? ? * 保存用戶
? ? * @param user
? ? * @return
? ? */
? ? boolean saveUser(Object user);
? ? /**
? ? * 根據(jù)用戶uid刪除該uid對應(yīng)的用戶信息
? ? * @param uid
? ? * @return
? ? */
? ? boolean deleteUser(int uid);
? ? /**
? ? * 更新指定用戶信息
? ? * @param obj
? ? * @return
? ? */
? ? boolean updateUser(Object obj);
? ? void getUserByUid();
}
/**
*? 以注解的方式實現(xiàn)的切面類MyAspect
*
*? ? ? 當(dāng)前類中的五種通知方式均以注解方式完成
*/
@Component? ? ? ? ? //? 標(biāo)注當(dāng)前類為一個組件
@Aspect? ? ? ? ? ? //? 標(biāo)注當(dāng)前類為一個切面類
public class MyAspect {
? ? /**
? ? * @Pointcut 注解為了避免相同的匹配規(guī)則被定義多處渔期,專門定義該方法設(shè)置執(zhí)行的匹配規(guī)則,各個自行調(diào)用即可
? ? *? ? write once婴噩, only once
? ? */
? ? @Pointcut(value = "execution(* com.qfedu.aop06.*.*(..))")
? ? public void setAll(){}
? ? /**
? ? * @Before 表示該方法為一個前置通知
? ? * @param jp 連接點
? ? */
? ? @Before("setAll()")
? ? public void myBefore(JoinPoint jp){
? ? ? ? //System.out.println(jp.getArgs());
? ? ? ? System.out.println("this is before.");
? ? }
? ? /**
? ? * @After 表示該方法為一個后置通知
? ? * @param jp 連接點
? ? */
? ? @After("setAll()")
? ? public void myAfter(JoinPoint jp){
? ? ? ? //System.out.println(jp.getArgs());
? ? ? ? System.out.println("this is after.");
? ? }
? ? /**
? ? * @Around 表示該方法為一個環(huán)繞通知
? ? * @param pjp 處理連接點
? ? * @return 返回每個業(yè)務(wù)方法的返回值
? ? */
? ? @Around("setAll()")
? ? public Object myAround(ProceedingJoinPoint pjp){
? ? ? ? Object obj = null;
? ? ? ? try {
? ? ? ? ? ? System.out.println("this is around before");
? ? ? ? ? ? obj = pjp.proceed();
? ? ? ? ? ? System.out.println("this is around after");
? ? ? ? } catch (Throwable throwable) {
? ? ? ? ? ? throwable.printStackTrace();
? ? ? ? }
? ? ? ? return obj;
? ? }
? ? /**
? ? * @AfterReturning 表示該方法為一個帶有返回值的通知
? ? * @param jp 連接點
? ? * @param obj 業(yè)務(wù)方法的返回值
? ? */
? ? @AfterReturning(value = "setAll()", returning = "obj")
? ? public void myReturn(JoinPoint jp, Object obj){
? ? ? ? System.out.println("this is after returnning " + obj);
? ? }
? ? /**
? ? * @AfterThrowing 表示該方法為一個帶有異常的通知
? ? * @param jp 連接點
? ? * @param e Throwable對象
? ? */
? ? @AfterThrowing(value = "setAll()", throwing = "e")
? ? public void myThrowing(JoinPoint jp, Throwable e){
? ? ? ? System.out.println("this is after throwing " + e.getMessage());
? ? }
}
beans文件配置
使用BeanPostProcessor方式實現(xiàn)Spring的AOP(第七種)
public interface IUserService {
? ? /**
? ? * 獲取所有的用戶對象列表
? ? * @return
? ? */
? ? List<Object> getAllUser();
? ? /**
? ? * 保存用戶
? ? * @param user
? ? * @return
? ? */
? ? boolean saveUser(Object user);
? ? /**
? ? * 根據(jù)用戶uid刪除該uid對應(yīng)的用戶信息
? ? * @param uid
? ? * @return
? ? */
? ? boolean deleteUser(int uid);
? ? /**
? ? * 更新指定用戶信息
? ? * @param obj
? ? * @return
? ? */
? ? boolean updateUser(Object obj);
? ? void getUserByUid();
}
beans文件配置