注意:通过接口实现可以用Method method, Object[] args, Object target, Exception ex 获取相关信息。
通过schema和注解,可以通过joinPoint\Object returnValue\throws e
相关jar包:
1、aopliance.jar
2、aspectjweaver.jar
- <!-- aop -->
- <!-- 配置切入点 -->
- <bean
id="clazzDao"
class="cn.tri.dao.impl.ClazzDaoImpl"></bean>
- <!-- 配置前置通知 -->
- <bean
id="aopBefor"
class="cn.tri.aop.AopBefor"></bean>
- <!-- 关联前置通知和切入点 -->
- <aop:config>
- <aop:pointcut
expression="execution(public void cn.tri.dao.impl.ClazzDaoImpl.showClazz(java.lang.String))"
id="testAopBefor"/>
- <aop:advisor
advice-ref="aopBefor"
pointcut-ref="testAopBefor"/>
- </aop:config>
|
异常通知,有些许不一样,必须实现ThrowAdvice接口,写afterThrowing方法。 无异常不触发
- public class AopException implements ThrowsAdvice{
- public
void
afterThrowing(Method method, Object[] args, Object target, Exception ex){
- System.out.println("---异常通知");
- System.out.println(method+"---"+args.length+"---"+target+"---"+ex);
- }
- }
|
<aop:ponitcut expressssion="全类名+方法+参数" id="随意1">
<aop:advisor advice-ref="通知类id" pointcut-ref="随意1"
此2句将切入点和通知绑定,
多个showclazzX 需要X个 excution();
前置通知实现 MethodBeforeAdvice
后置通知实现 AfterReturningAdvice
假设a、b、c都有共同方法showClazz();
前置通知AopBefor impelement MethodBeforAdvice
注解Aop
- <!--扫描带有componte\controller\service\Respository-->
- <context:component-scan
base-package="cn.tri.aop"></context:component-scan>
- <!--扫描@aspectj 注解-->
- <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
|
- @Component("AopAnnotation")//同<bean id="AopAnnotation" class="此类"> 加入IOC容器
- @Aspect//申明此类为通知类
- public class AopAnnotation {
-
- @Before("execution(public * getName())")
- public
void
AnnotationBefor(JoinPoint jp){
- System.out.println("方法数:"+jp.getSignature().getModifiers()+"/n"+
- "方法名:"+jp.getSignature().getName()+"/n"+
- "方法所在类:"+jp.getSignature().getDeclaringType()+"/n"
- );
- System.out.println("前置通知");
- //System.out.println(returnValue+"---"+method+"---"+args.length+"---"+target);
}
- @After("execution(public * getName())")
- public
void
AnnotationAfter(){
- System.out.println("后置通知");
}
- @AfterThrowing(value="execution(public * getName())",Exception e)//此处只会捕获申明异常
- public
void
AnnotationThrowing(){
- System.out.println("异常通知");
}
- @AfterReturning(value="execution(public * getName())",returning="result")
- public
void
AnnotationReturning(JoinPoint jp,Object result){
- System.out.println("后置通知");
}
- @Around(value="execution(public * getName())")
- public
void
AnnotationAround(ProceedingJoinPoint pjp){
- try
{
- //前置
- pjp.proceed();//执行切面
- //后置
- }
catch
(Throwable e) {
- System.out.println("异常");
- e.printStackTrace();
- }
- System.out.println("环绕通知");
- }
-
- }
|
schema配置
- <!-- 配置schema 通知 -->
- <bean id="testSchema"
class="cn.tri.dao.impl.SchemaClazz">
- </bean>
- <bean id="aopSchema"
class="cn.tri.aop.AopSchema"></bean>
- <aop:config>
- <!-- 配置切入点 -->
- <aop:pointcut expression="execution(public void cn.tri.dao.impl.SchemaClazz.testSchema())" id="schemaAop"/>
- <aop:aspect ref="aopSchema">
- <aop:before method="beforSchema" pointcut-ref="schemaAop"/>
- <aop:after method="afterSchema" pointcut-ref="schemaAop"/>
- <aop:after-returning method="retrunSchema" returning="retrunValue" pointcut-ref="schemaAop"/>
- <!-- 连接线 -->
- </aop:aspect>
- </aop:config>
|
- public class SchemaClazz {
- public
void
testSchema(){
- System.out.println("Schema切入点");
- }
- }
|