首先配置依赖
2.创建接口与实现类
3.创建切面类。方法是在类的上面加上@aspect.
这里用到的是@before:前置通知注解。
属性 value是切入点表达式,是切入点切入的位置
位置:在方法的上面
特点:目标方法之前执行,不会改变目标方法的执行,不会改变目标方法的执行结果
要加强一个还是多个方法要看execution后面的东西是一个还是带正则表达式
例如:execution(public * (…))
指定切入点为任意切入方法
execution( set*(…))
指定切入点为任意一个以set开始的方法
下面是execution的几种写法:
@Before(value = “execution(public void com.zixue.ba01.someserviceImpl.doSome(String,Integer))”)
public void Mybefore(){
切面要执行的代码功能
System.out.println(“前置通知,切面功能:在目标方法之前输出执行时间:”+new Date());
@Before(value = “execution(void com.zixue.ba01.someserviceImpl.doSome(String,Integer))”)
public void Mybefore(){
切面要执行的代码功能
System.out.println(“1===前置通知,切面功能:在目标方法之前输出执行时间:”+new Date());}
@Before(value = “execution(* …someserviceImpl.do(…))”)
public void Mybefore(){
切面要执行的代码功能
System.out.println(“2===前置通知,切面功能:在目标方法之前输出执行时间:”+new Date());}
@Before(value = “execution(* do*(…))”)
public void Mybefore2(){
切面要执行的代码功能
System.out.println(“3===前置通知,切面功能:在目标方法之前输出执行时间:”+new Date());}
execution中还有一个JoinPoint参数。指定通知方法中的参数:JoinPoint(JoinPoint首字母大写)。JoinPoint代表业务方法,要加入切面功能的业务方法。可以再通知方法中获取方法的信息,例如方法名称,方法实参。如果切面方法中需要用到方法的信息,就加入JoinPoint。joinpoint参数的值是由框架赋予的,必须是第一个位置参数。
4.由spring容器代理创建对象
5.创建测试类
2)@AfterReturning
属性:value 切入点表达式
returing 自定义的变量,表示方法的返回值
自定义的变量名和自定义的形参名一样 Object res = doOther()
位置:方法定义的上面
在目标方法之后执行的
能够获得目标方法的返回值,可以根据这个返回值做不同的处理功能
能修改返回值
3)@around 环绕通知
属性:value切入点表达式
位置:方法的定义上面
特点:
它是功能最强的通知
在目标的前后都能增强功能
能控制目标方法是否被调用执行
能修改原来的目标方法执行结果,影响最后的调用结果
等同于jdk的动态代理,ProceedingJoinPoint等同于Method
参数作用:执行目标方法
返回值:目标方法的执行结果,可以被修改。
环绕通知:经常做事务。在方法之前开启事务,执行目标方法,在方法后执行事务
4)@afterThroing
* 属性:value 切入点表达式
* throwing:自定义的变量,表示目标方法自定义的变量
* 变量名和方法的参数名一样
*
* 特点:
* 在目标方法抛出异常时执行
* 可以做异常的监控程序,监控目标方法是否有异常。如果有异常,可以发送短信,邮件进行通知
5)@After:最终通知
- 属性:value切入点表达式
- 位置:在方法的上面
- 特点:
- 总是会执行
- 在方法后面执行
6)@Pointcut
用方法名代替execution后面的地址
7)在有接口的情况下默认使用的是jdk动态代理,在无接口的情况下默认使用的是cglib动态代理。如果想在有接口的情况下使用cglib动态代理,要在applicationContext.xml里面加上
<aop:aspectj-autoproxy proxy-target-class=“true”/>