zoukankan      html  css  js  c++  java
  • day39-Spring 11-Spring的AOP:基于AspectJ的XML配置方式


    package cn.itcast.spring3.demo2;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    
    /**
     * 切面类
     * @author zhongzh
     *
     */
    public class MyAspectXML {
         public void before(){
             System.out.println("前置通知......");
         }
         public void afterReturning(Object returnVal){
             System.out.println("后置通知......"+returnVal);
         }
         public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{//环绕通知,可以阻止目标方法的执行.
             System.out.println("环绕前增强....");
             Object result = proceedingJoinPoint.proceed();
             System.out.println("环绕后增强....");
            return result;
         }
         //异常通知
         public void afterThrowing(Throwable e){
             System.out.println("异常通知...."+e.getMessage());
         }
         //最终通知
         public void after(){
             System.out.println("最终通知.....");
         }
    }
    package cn.itcast.spring3.demo2;
    
    public class ProductDao {
       //public void add(){
         public int add(){
           System.out.println("添加商品.......");
           int d = 10/0;
           return 100;
       }
       public void update(){
           System.out.println("修改商品.......");
       }
       public void delete(){
           System.out.println("删除商品.......");
       }
       public void find(){
           System.out.println("查询商品.......");
       }
    }
    package cn.itcast.spring3.demo2;
    
    import org.aspectj.lang.annotation.After;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext2.xml")
    public class SpringTest2 {
        @Autowired
        @Qualifier("productDao")
        private ProductDao productDao;
        
        @Test
        public void demo1(){
            productDao.add();
            productDao.find();
            productDao.update();
            productDao.delete();
        }
        
    }
    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 引AOP的约束了,Schema里面必须是带有AOP的. -->
    <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="productDao" class="cn.itcast.spring3.demo2.ProductDao"></bean>
         <!-- 定义切面 -->
         <bean id="myAspectXML" class="cn.itcast.spring3.demo2.MyAspectXML"></bean>
         <!-- 定义aop配置 --><!-- 现在已经引入了AOP的名字空间 -->
         <aop:config>
             <!-- 定义切点,切点其实就是在哪些类哪些方法上应用增强 -->
             <aop:pointcut expression="execution(* cn.itcast.spring3.demo2.ProductDao.add(..))" id="mypointcut"/>
             <!-- 应用哪一个增强  advisor和aspect都是切面  advisor是一个切点和一个通知的组合 aspect是多个切点和多个通知的组合 -->
             <aop:aspect ref="myAspectXML"><!-- 定义切面 -->
                   <!-- 前置通知 -->
                   <aop:before method="before" pointcut-ref="mypointcut"/><!-- 前置通知 --><!-- 在哪个切点上面去应用前置通知 -->
                   <!-- pointcut-ref对切点的引用,是前置的还是后置的 -->
                   <!-- 后置通知  后置通知可以获取目标方法的返回值-->
                   <aop:after-returning method="afterReturning" pointcut-ref="mypointcut" returning="returnVal"></aop:after-returning><!-- pointcut-ref引入切点 -->
                   <!-- 环绕通知 -->
                   <aop:around method="around" pointcut-ref="mypointcut"></aop:around>
                   <!-- 异常通知 -->
                   <aop:after-throwing method="afterThrowing" pointcut-ref="mypointcut" throwing="e"></aop:after-throwing>
                   <!-- 最终通知 -->
                   <aop:after method="after" pointcut-ref="mypointcut"></aop:after>
             </aop:aspect>
         </aop:config>
    </beans>
  • 相关阅读:
    SSIS 错误代码 DTS_E_OLEDB_EXCEL_NOT_SUPPORTED 没有可用的 OLE DB 访问接口 SSIS 的 64 位版本中不支持 Excel 连接管理器
    WIN8安装SQL SERVER2008:出现创建userSettings/Microsoft.SqlServer.Configuration.LandingPage.Properties.Settings 的配置节处理程序时出错的解决办法。
    WIN8安装SQL SERVER2008:出现"MsiGetPRoductInfo” 无法检索 Product Code {47439CBBCF57485B9994BE9E02D29193}的包的 ProductVersion;解决办法。
    解读QT信号与槽机制里 QMetaObject::connectSlotsByName(QObject *o)的源码
    初涉Windows Mobile下的QT程序移植和部署
    C++虚函数探索笔记(1)——虚函数的简单示例分析
    一个不应该发生的BUG。。。
    Qt.Visual.Studio.Integration.1.4.3 与 QT 4.5.0 Commercial for VS2008搭档的一个小问题
    C++ 逗号操作符二三事
    C++虚函数探索笔记(3)——延伸思考:虚函数应用的一些其他情形
  • 原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/6811232.html
Copyright © 2011-2022 走看看