aspect

package aspectJ;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect//使用切面需要这个注解
@Component//扫描到这个类
public class MyAspect {
    //定义切入点的表达式
    @Pointcut("execution(* dao.*.steal*(..))")//第一个*表示返回类型,dao包名,第二个*表示class,第三个*代表方法,括号表示所有类型的参数
    private void myPointCut(){}//使用一个返回值为void,方法体为空的方法来命名切入点
    @Before("myPointCut()")//前置通知
    public void myBefore(JoinPoint joinPoint){
        System.out.println("[守护者]发现猴子正在进入果园,警告不要偷东西..");
        /*System.out.println("目标类是:"+joinPoint.getTarget());
        System.out.print(",被织入增强处理的目标方法为:"+joinPoint.getSignature().getName());*/
    }
    @AfterReturning(value="myPointCut()",returning="rtv")//如发生异常,不会执行("myPointCut()&&args(name,..)")
    public void myAfterReturning(JoinPoint joinPoint,Object rtv){
        System.out.println("[守护者]抓住了猴子,守护者审问出了猴子的名字叫"+rtv+"..");
        //System.out.println("被织入增强处理的目标方法为:"+joinPoint.getSignature().getName());
        //System.out.println("Return:"+rtv);
    }
    //@Around("myPointCut()")
    public Object myAround(ProceedingJoinPoint pro) throws Throwable{
        System.out.println("环绕开始:执行目标方法之前,模拟开启事物...");
        Object obj=pro.proceed();
        System.out.println("环绕结束:执行方法之后,模拟事物关闭..");
        return obj;
    }
    //@AfterThrowing(value="myPointCut()",throwing="e")//异常通知,捕获异常
    public void myAfterThrowing(JoinPoint joinPoint,Throwable e){
        System.out.println("异常通知:"+"出错了"+e.getMessage());
    }
    //@After("myPointCut()")//最终通知,发生异常仍然执行
    public void myAfter(){
        System.out.println("最终通知:模拟方法结束后的释放资源...");
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:aop="http://www.springframework.org/schema/aop"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="http://www.springframework.org/schema/beans 
  http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
  http://www.springframework.org/schema/aop 
  http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
  http://www.springframework.org/schema/context 
  http://www.springframework.org/schema/context/spring-context-4.3.xsd">
       <!-- 指定需要扫描的包,使注解生效 -->
      <context:component-scan base-package="dao" />
      <!-- <context:component-scan base-package="aspectJ" /> -->
      <context:component-scan base-package="entity" />
     <!--  启动基于注解的声明式AspectJ支持 -->
      <aop:aspectj-autoproxy />
</beans>
package test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import dao.MonkeyDao;


public class Test {
    public static void main(String[] args){
        String xmlPath="test/aspects.xml";
         ApplicationContext applicationContext=new ClassPathXmlApplicationContext(xmlPath);
         MonkeyDao monkeyDao=(MonkeyDao) applicationContext.getBean("monkeyDaoImpl");
         monkeyDao.stealPeach("孙大圣");
         monkeyDao.stealApple("孙二圣");
         monkeyDao.dance();
    }
}

 

posted @ 2018-11-06 22:03  小萌新哒哒  阅读(778)  评论(0编辑  收藏  举报