跟我重温spring---AOP(3)

1、 AspectJ的注解方式AOP的开发

具体的开发步骤

    1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包

        * 先引入Spring框架开发的基本开发包,还需要引入AOP的开发包(AOP联盟和AOP的开发包)

        * 再引入AspectJ的开发包

            * 引入AOP联盟的开发包                   --com.springsource.org.aopalliance-1.0.0.jar

            * 引入Spring框架传统的AOP的开发包     -- spring-aop-3.2.0.RELEASE.jar

            * aspectj 本身jar包                        --com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

            * spring支持aspectj的包                 --spring-aspects-3.2.0.RELEASE.jar

 

    2. 步骤二:创建Spring的配置文件,引入具体的AOP的schema约束(不要忘记配置提示)

        <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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd

               http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd">

 

    3. 步骤三:创建包结构,编写具体的实现类代码

        * com.spring.demo1

            * OrderDaoImpl

 

    4. 步骤四:将目标类配置到Spring中

        <!-- 目标类-->

        <bean id="orderDaoImpl"class="com.spring.spring.OrderDaoImpl"/>

 

    5. 步骤五:编写切面(切面 = 通知 + 切入点),所以需要先来了解通知的类型和切入点的表达式定义!!

        1. AspectJ的通知类型如下

            @Before                 -- 前置通知,相当于BeforeAdvice

            @AfterReturning         -- 后置通知,相当于AfterReturningAdvice

            @Around                 -- 环绕通知,相当于MethodInterceptor

            @AfterThrowing          -- 抛出通知,相当于ThrowAdvice

            @After                  -- 最终final通知,不管是否异常,该通知都会执行

 

        2. AspectJ的切入点表达式定义:就是用来限制哪些类的哪些方法需要进行增强!!

            * 如果想完成切入点的定义,需要大家来了解 execution(切入点表达式)的函数,括号中就是具体的表达式的写法

            * execution(切入点表达式)的函数的语法

 

        3. 编写切面代码

            @Aspect

            public class MyAspectAnno {

               @Before(value="execution(public *com.spring.demo1.OrderDaoImpl.save(..))")

                public void before(){

                    System.out.println("前置通知...");

                }

            }

 

            在核心的配置文件中,配置切面类

            <!-- 配置切面 -->

            <beanid="myAspectAnno"class="com.spring.demo1.MyAspectAnno"/>

 

    6. 步骤六:在核心的配置文件中开启AspectJ的注解的自动代理

        <!-- 开启自动代理-->

        <aop:aspectj-autoproxy/>

 

    7. 步骤七:编写测试代码

        @RunWith(SpringJUnit4ClassRunner.class)

       @ContextConfiguration("classpath:applicationContext.xml")

        public class Demo1 {

           @Resource(name="orderDaoImpl")

            private OrderDaoImpl orderDaoImpl;

            @Test

            public void run(){

                orderDaoImpl.save();

            }

        }

 

2、 注解方式通知类型的使用

AspectJ的注解方式完成AOP的开发

a. 前置通知:

    * @Before       -- 代表在目标方法之前执行增强.

    * 前置通知中有一个参数:Joinpoint:获得切入点信息.

 

b. 后置通知:

    * @AfterReturing        -- 代表在目标方法之后执行增强.

    * 可以获得到目标方法的返回值,需要在注解中添加returning="result"属性

    * 代码:

        // 后置通知:

        @AfterReturning(value="execution(*com.spring.spring.demo1.OrderDao.update(..))",returning="result")

        public void afterReturing(Objectresult){

            System.out.println("后置通知================"+result);

        }

 

c. 环绕通知:

    * @Around       -- 代表在目标方法之前和之后执行增强.

    * 用来阻止目标方法执行,需要使用ProceedingJoinPoint对象作为参数!!

    * 代码:

        // 环绕通知:

        @Around("execution(*com.spring.spring.demo1.OrderDao.delete(..))")

        public Object around(ProceedingJoinPointjoinPoint) throws Throwable{

            System.out.println("环绕前通知===============");

            // 执行目标方法:

            Object obj = joinPoint.proceed();

            System.out.println("环绕后通知===============");

            return obj;

        }

 

c. 异常抛出通知:

    * @AfterThrowing        -- 代表在目标方法出现异常的时候执行增强.

    * 获得到异常的信息.

    * 代码:

        // 异常抛出通知:

        @AfterThrowing(value="execution(*com.spring.spring.demo1.OrderDao.find(..))",throwing="e")

        public void afterThrowing(Throwable e){

            System.out.println("异常抛出通知=============="+e.getMessage());

        }

 

e. 最终通知

    * @After        -- 代表无论目标方法是否出现异常.这种通知总是会执行的.类似try{}catch(){}finally{}

    * 代码

        // 最终通知

        @After(value="execution(*com.spring.spring.demo1.OrderDao.find(..))")

        public void after(){

            System.out.println("最终通知================");

        }

 

3、 切入点的定义

1. 概述

    * 可以在切面的类中来定义切入点的方法,这样做的好处是在具体的通知方法中直接引入切入点,程序维护最简单!!

 

2. 相关的代码

    @Pointcut(value="execution(* com.spring.spring.demo1.OrderDao.find(..))")

    private void myPointcut(){}

 

3. 在通知的方法中引入切入点

    * @Around(value="切面类名.切入点的方法()")

    * 例如:@Around(value="MyAspectjAnno.myPointcut()")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值