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 }
===================
前置通知。。。
添加用户。。。。
后置通知。。。


================================================================

 

posted @ 2020-09-01 23:22  违和感  阅读(166)  评论(0)    收藏  举报