11 AspectJ 通知类型
AspectJ通知类型
aop联盟定义通知类型,aop联盟的jar都是接口,必须有实现类来实现
aspectj通知类型,只定义类型名称,以及方法格式。
六种:
before:前置通知(应用:各种校验)
在方法执行前执行,如果通知抛出异常,阻止方法运行
afterReturning:后置通知(应用:常规数据处理)
方法正常返回后执行,如果方法中抛异常,通知无法执行
必须在方法执行后才执行,所以可以获得方法的返回值
around:环绕通知(应用:十分强大,可以做任何事情)
方法执行前后分别执行,可以阻止方法的执行
必须手动执行目标方法
afterThrowing:抛出异常通知(应用:包装异常信息)
方法抛出异常后执行,如果方法没有抛出异常,无法执行
after:最终通知(应用:清理现场)
方法执行完毕后执行,无论方法中是否出现异常

上面标签 对应的类

案例:
导入jar包

接口:IUserService
1 package com.iwakan.service; 2 3 public interface IUserService { 4 5 void addUser(); 6 7 void updateUser(); 8 9 void deleteUser(); 10 }
实现类:UserServiceImpl
1 package com.iwakan.service.impl; 2 3 import com.iwakan.service.IUserService; 4 5 public class UserServiceImpl implements IUserService { 6 @Override 7 public void addUser() { 8 System.out.println("添加用户。。。。"); 9 } 10 11 @Override 12 public void updateUser() { 13 System.out.println("更新用户。。。。"); 14 } 15 16 @Override 17 public void deleteUser() { 18 System.out.println("删除用户。。。。"); 19 } 20 }
切面类:MyAspect
1 package com.iwakan.aspect; 2 3 import org.aspectj.lang.ProceedingJoinPoint; 4 5 public class MyAspect { 6 7 public void myBefore(){ 8 System.out.println("前置通知。。。"); 9 } 10 11 public void myAfterReturning(){ 12 System.out.println("后置通知。。。"); 13 } 14 15 public Object myAround(ProceedingJoinPoint pjd) throws Throwable { 16 17 System.out.println("开启事务..."); 18 //放行 19 Object retObj = pjd.proceed(); 20 System.out.println("提交事务..."); 21 return retObj; 22 } 23 }
================================================================
环绕通知
配置文件:beans.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:aop="http://www.springframework.org/schema/aop" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans.xsd 7 ttp://www.springframework.org/schema/context 8 http://www.springframework.org/schema/context/spring-context.xsd 9 http://www.springframework.org/schema/aop 10 http://www.springframework.org/schema/aop/spring-aop.xsd"> 11 <!--配置UserService--> 12 <bean id="userService" class="com.iwakan.service.impl.UserServiceImpl"></bean> 13 14 <!--配置切面--> 15 <bean id="myAspect" class="com.iwakan.aspect.MyAspect"></bean> 16 17 <!--配置AOP--> 18 <aop:config proxy-target-class="true"> 19 <!--aop:指定切面--> 20 <aop:aspect ref="myAspect"> 21 <!--定义一个切入点--> 22 <aop:pointcut id="myPointcut" expression="execution(* com.iwakan.service.impl.UserServiceImpl.*(..))"/> 23 <!--配置环绕通知--> 24 <aop:around method="myAround" pointcut-ref="myPointcut"/> 25 </aop:aspect> 26 </aop:config> 27 28 </beans>
main方法:
1 package com.iwakan.test; 2 3 import com.iwakan.service.IUserService; 4 import org.junit.Test; 5 import org.springframework.context.ApplicationContext; 6 import org.springframework.context.support.ClassPathXmlApplicationContext; 7 8 public class Run { 9 10 @Test 11 public void test(){ 12 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); 13 IUserService userService = (IUserService)context.getBean("userService"); 14 userService.addUser(); 15 } 16 }
===================
开启事务...
添加用户。。。。
提交事务...
================================================================
前置通知和后置通知
配置文件:beans.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:aop="http://www.springframework.org/schema/aop" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans.xsd 7 ttp://www.springframework.org/schema/context 8 http://www.springframework.org/schema/context/spring-context.xsd 9 http://www.springframework.org/schema/aop 10 http://www.springframework.org/schema/aop/spring-aop.xsd"> 11 <!--配置UserService--> 12 <bean id="userService" class="com.iwakan.service.impl.UserServiceImpl"></bean> 13 14 <!--配置切面--> 15 <bean id="myAspect" class="com.iwakan.aspect.MyAspect"></bean> 16 17 <!--配置AOP--> 18 <aop:config proxy-target-class="true"> 19 <!--aop:指定切面--> 20 <aop:aspect ref="myAspect"> 21 <!--定义一个切入点--> 22 <aop:pointcut id="myPointcut" expression="execution(* com.iwakan.service.impl.UserServiceImpl.*(..))"/> 23 <!--配置前置通知--> 24 <aop:before method="myBefore" pointcut-ref="myPointcut"/> 25 <!--配置后置通知--> 26 <aop:after-returning method="myAfterReturning" pointcut-ref="myPointcut"/> 27 28 29 </aop:aspect> 30 </aop:config> 31 32 </beans>
main方法:
1 package com.iwakan.test;
2
3 import com.iwakan.service.IUserService;
4 import org.junit.Test;
5 import org.springframework.context.ApplicationContext;
6 import org.springframework.context.support.ClassPathXmlApplicationContext;
7
8 public class Run {
9
10 @Test
11 public void test(){
12 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
13 IUserService userService = (IUserService)context.getBean("userService");
14 userService.addUser();
15 }
16 }
===================
前置通知。。。
添加用户。。。。
后置通知。。。
================================================================

浙公网安备 33010602011771号