Spring框架之通知类型

继上一篇的知识:接下来就根据下面这张图的,UserDao类的增、删、改、查方法,来进行对Spring通知的了解。

一、 Spring通知类型

1.1、前置通知:在目标方式执行之前的操作        获得切入点的信息
        如:         <!-- 配置切面 -->
                        <aop:aspect ref="myAspect">
                                <aop:before method="checkProxy" pointcut-ref="pointcut1"/>
                        </aop:aspect>
    1.2、后置通知:在目标方式执行之后的操作        获得方法的返回值

    1.3、环绕通知:在目标方式执行之前和之后的操作           可以阻止目标方法的执行,性能监控
    1.4、异常抛出通知:在程序出现异常的时候,进行的操作
            事务管理,事务开始、事务终止、事务异常
    1.5、最终通知:无论代码是否异常,总会执行
    1.6、引入通知:(了解)

二、AOP的开发(基于AspectJ的XML方式)

步骤:1、引入jar包 
                  基本开发包
                  AOP的包(aop、aspects、expression、aspectj[依赖包])
          2、创建XML文件,引入约束(:the aop schema ..............方法参见he context schema约)
          3、编写目标类。增强(save、find、delete、update方法)
          4、编写测试类   (介绍一个单元测试的方法............)

说明:对于ProductDao及ProductDaoImpl类的创建和实现参考上一篇

2、创建applicationContext.xml  文件

 <!-- 配置目标对象:增强的对象 -->
        <bean id="productDao" class="com.dao.Impl.ProductDaoImpl">

        </bean>
        <!-- 将权限校验类交给Spring管理 -->
        <bean id="myAspect" class="com.domain.MyAspectXML">

        </bean>
        <!-- 通过AOP的配置完成对目标类产生代理 -->
        <aop:config>
                <!-- 表达式配置哪些类的那些方法需要增强 -->
                <aop:pointcut id="pointcut1" expression="execution(* com.dao.Impl.ProductDaoImpl.save())"/>
                <aop:pointcut id="pointcut2" expression="execution(* com.dao.Impl.ProductDaoImpl.delete())"/>
                <aop:pointcut id="pointcut3" expression="execution(* com.dao.Impl.ProductDaoImpl.update())"/>
                <aop:pointcut id="pointcut4" expression="execution(* com.dao.Impl.ProductDaoImpl.find())"/>
                <!-- 配置切面 -->
                <aop:aspect ref="myAspect">
                        <!--前置通知=============-->
                        <aop:before method="checkProxy" pointcut-ref="pointcut1"/>
                        <!-- 后置通知============= -->
                        <aop:after-returning method="writeLog" pointcut-ref="pointcut2" returning="result"/>
                        <!-- 环绕知=============== -->
                        <aop:around method="around" pointcut-ref="pointcut3"/>
                        <!-- 异常通知========== -->
                        <aop:after-throwing method="afterThrowing" pointcut-ref="pointcut4" throwing="ex"/>
                        <!-- 最终通知 -->
                        <aop:after method="after" pointcut-ref="pointcut4"/>
                </aop:aspect>
        </aop:config>

3、编写目标类。

             略......................

4、增强(save、find、delete、update方法),基于AspectJ的方式,创建MyAspectXML类实现这些功能,而实现这些方法的关键就是实现对它的配置;

public class MyAspectXML {
    /*=====================前置通知========================*/
    public void checkProxy(JoinPoint joinPoint){
        System.out.println("权限校验............."+joinPoint);
    }
    /*======================后置通知=======================*/
    public void writeLog(Object result){
        System.out.println("日志记录............."+result);
    }
    /*====================== 性能监控=======================*/
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("环绕前通知===========");
        Object obj = joinPoint.proceed();
        System.out.println("环绕后通知===========");
        return obj;
    }
    /*=====================异常抛出通知=========================*/
    public void afterThrowing(Throwable ex){
        System.out.println("异常抛出通知============="+ex.getMessage());
    }

    /*=========================最终通知========================*/
    public void after(){
        System.out.println("最终通知===========");
    }
}

5、测试类        略...........................

 三、2、Spring的切入点表达式的写法

    <aop:pointcut id="pointcut1" expression="execution(* com.dao.Impl.ProductDaoImpl.save())"/>
    基于一个execution的方法执行
    语法:【访问修饰符】  方法的返回值  包名.类名.方法名(参数)
        public void com.dao.userDao.save(..)    特定方法的增强
    *       :星号任意
    * com.com.dao.userDao+save(..)    表示当前类和子类都可以增强    
    * com.com.dao.userDao.*.*        表示这个包类的所有方法增

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值