spring03-3

不懂的话可以留言我,虽然我也很菜

AspectJ通知类型

AspectJ简介

  • AspectJ是一个基于java的aop框架.

  • spring2.0以后新增了对AspectJ切点表达式(就是expression后面的那个)的指出.

  • @AspectJ是AspectJ1.5新增功能,通过JDK5的注解技术,允许直接在Bean类中定义切面

  • 新版本spring框架,建议使用AspectJ来开发AOP,方便哈哈哈.

expression表达式

  • 格式: execution(修饰符 返回值 包.类.方法名(参数) throws 异常)
  • 修饰符,一般省略,比如: public表示公共,*表示任意.

  • 返回值,不能省略,比如: void表示没有返回值,String表示返回任意字符串,*表示任意.

  • 包,可省略,一般不省略,比如: com.fan.service表示service包下面的所有类,com.fan..表示fan这个包及其子包的所有类

  • 类,可省略,一般不省略,比如: User表示只拦截User类,*Impl表示拦截以Impl结尾的所有类,User*表示拦截所有以User开头的类,*表示任意类.

  • 方法名,不能省略,比如: addUser表示只拦截addUser()这个方法,add*表示拦截以add开头的所有方法,*add表示拦截以add结尾的方法,*表示任意

*throws,可省略,一般不写

对比AOP联盟通知类型

  • aop联盟定义通知advice类型,aop联盟的jar包里面都是接口,必须要有实现类(在spring-aop那个jar包里)(回想我们的切面类必须实现某个接口比如环绕通知接口,不然在测试的时候会报一系列错,不知道的话,看我**spring-03-2**这篇博客).

  • 而AspectJ通知类型,只定义类型名称以及方法格式,一共有6种,在xml中有对应的标签配置.

  • before: 前置通知,应用于各种校验,在方法执行前执行,如果通知出现异常,阻止方法运行.

  • afterReturning: 后置通知,应用于常规的数据处理,方法正常返回后执行,如果方法中出现异常,通知无法执行,由于它必须在方法执行后执行,所有可以获得方法的返回值.

  • around: 环绕通知,这个就很牛逼,可以做很多事情,方法执行前后分别执行,可以阻止方法的执行,必须手动执行目标方法,具体见例子.

  • afterThrowing: 抛出异常,应用于包装异常信息,方法抛出异常后执行,如果没有抛出异常则无法执行

  • after: 最终通知,应用于清理现场,方法执行完毕后执行,无论方法是否出现异常.

AspectJ基于xml使用案例

	第一步:
		导包:(idea创建spring项目的话它自己就有)
		aopalience.jar--aop联盟规范
		spring-aop.jar--aop实现
		aspectj.weaver.jar--aspectj规范
		spring-aspects.jar--aspectj的实现
	
	第二步:
		目标类:
		public class User {
		    public void addUser() {
		        System.out.println("没有参数添加用户!");
		    }
		    public void addUser(int i) {
		        System.out.println("一个参数添加用户!");
		    }
		    public void addUser(int i,int j) {
		        System.out.println("两个参数添加用户!");
		    }
		}
	
	第三步:
		切面类
		import org.aspectj.lang.ProceedingJoinPoint;
		
		public class MyAspect {
		    /**
		     * 前置通知
		     */
		    public void myBefore() {
		        System.out.println("前置通知!");
		    }
		
		    /**
		     * 后置通知
		     */
		    public void myAfterReturning() {
		        System.out.println("后置通知!");
		    }
		
		    /**
		     *
		     * @param pjp 手动执行的目标对象的连接点
		     */
		    public Object myAround(ProceedingJoinPoint pjp) throws Throwable {
		        System.out.println("环绕通知!" + pjp);//pjp其实就是expression表达式中execution那一串
		
		        System.out.println("开启事务");
		        //放行
		        Object obj = pjp.proceed();
		
		        System.out.println("提交事务");
		        return obj;
		    }
		}
	
	第四步:
		配置文件
		<?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"
		       xsi:schemaLocation="http://www.springframework.org/schema/beans
		                        http://www.springframework.org/schema/beans/spring-beans.xsd
		                            http://www.springframework.org/schema/aop
		                        http://www.springframework.org/schema/aop/spring-aop.xsd">
		
		    <!--配置目标类对象-->
		    <bean id="user" class="example2.service.User"></bean>
		
		    <!--配置切面类对象-->
		    <bean id="myAspect" class="example2.MyAspect"></bean>
		
		
		    <!--aop配置-->
		    <aop:config>
		        <!--配置切面-->
		        <aop:aspect ref="myAspect">
		            <!--配置切入点,只切入service包下面User类中以add开头的方法,参数为任意-->
		            <aop:pointcut id="myPointCut" expression="execution(* example2.service.User.add*(..))"></aop:pointcut>
		            
		            <!--配置前置通知-->
		            <!--<aop:before method="myBefore" pointcut-ref="myPointCut"></aop:before>-->
		
		            <!--配置后置通知-->
		            <!--<aop:after-returning method="myAfterReturning" pointcut-ref="myPointCut"></aop:after-returning>-->
		
		            <!--配置环绕通知,注意这里必须手动执行目标对象-->
		<aop:around method="myAround" pointcut-ref="myPointCut"></aop:around>
		        </aop:aspect>
		    </aop:config>
		</beans>
	
	第五步:
		测试类
		import example2.service.User;
		import org.junit.Test;
		import org.springframework.context.ApplicationContext;
		import org.springframework.context.support.ClassPathXmlApplicationContext;
		
		public class UnitClass {
		
		    @Test
		    public void test() {
		        ApplicationContext context = new ClassPathXmlApplicationContext("beans2.xml");
		
		        User user = (User) context.getBean("user");
		
		        user.addUser();
		        System.out.println("--------");
		        user.addUser(1);
		        System.out.println("--------");
		        user.addUser(1,2);
		    }
		}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值