基于注解形式的aop實作 1.jar 與實作介面方式的一致, 2.配置 將業務類、通知類納入IOC容器, 開啟注解對AOP的支持,
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
使用@Componet注解需要掃描器,
<context:component-scan base-package="org.ghl.aop"/>3.撰寫 通知類
//給予注解實作aop
//加此注解后此類是通知
@Aspect
public class LogAspectAnnotation {
//添加注解使得方法變成前置通知方法
@Before("execution(public * addStudent(..))") //屬性:定義切點
public void logBeforeAnno(){
System.out.println("注解形式【前置通知】...");
}
//注解實作后置通知
@AfterReturning("execution(public * addStudent(..))") //屬性:定義切點
public void logAfterAnno(){
System.out.println("注解形式【后置通知】...");
}
}
注意:掃描器會將指定包中的@Componet, @Service, @Respository, @Controller 修飾的類產生的物件添加到xml中,
*通過注解形式實作的aop,獲取目標物件的資訊,要通過物件JoinPoint, 注解形式回傳值問題: 宣告回傳值的引數名,//注解實作后置通知
@AfterReturning(pointcut = "execution(public * org.ghl.service.impl.StudentServiceImpl.addStudent(..))",returning = "returningValue") //屬性:定義切點
public void logAfterAnno(JoinPoint jp,Object returningValue){
System.out.println("注解形式【后置通知】...:目標物件:"+jp.getTarget()+",方法名:"+jp.getSignature().getName()+",引數串列:"+ Arrays.toString(jp.getArgs())+",回傳值:"+returningValue);
}
*若報錯:IllegalArgumentException: 引數例外,
*注解形式例外通知,若想捕獲指定的例外,則用第二個引數e
//例外通知,若想捕獲指定的例外,則用第二個引數
@AfterThrowing(value = "https://www.cnblogs.com/ghlz/p/execution(public * org.ghl.service.impl.StudentServiceImpl.addStudent(..))",throwing = "e")
public void logExceptionAnno(JoinPoint jp,NullPointerException e){
System.out.println("《注解形式【例外通知】》:e:"+e.getMessage());
}
基于Schema形式的aop實作(通過配置實作aop) (1)撰寫一個普通類; (2)將該類通過配置變成一個“通知”,
<!--基于Schema形式的aop實作-->
<bean id="logSchema" >
</bean>
<aop:config>
<!--配置切入點(在哪里執行通知)-->
<!--=====連接線的另一方======-->
<aop:pointcut expression="execution(public * org.ghl.service.impl.StudentServiceImpl.addStudent(org.ghl.entity.Student))" id="pcSchema"></aop:pointcut>
<!--advisor相當于連接切入點和切面的線-->
<!--=======連接線=======-->
<!-- <aop:advisor advice-ref="logSchema" pointcut-ref="pcSchema"/>-->
<!--Schema形式-->
<aop:aspect ref="logSchema">
<!--連接線-->
<aop:before method="before" pointcut-ref="pcSchema"/>
<aop:after-returning method="afterReturning" pointcut-ref="pcSchema" returning="returnValue"/>
<aop:after-throwing method="whenException" throwing="e" pointcut-ref="pcSchema"/>
<aop:around method="around" pointcut-ref="pcSchema"/>
</aop:aspect>
</aop:config>
獲取目標物件時: 注解、Schema形式:JoinPoint 介面:Object returnValue, Method method, Object[] args, Object target
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/158664.html
標籤:Java
