• JavaWeb学习:Spring的AOP的开发(AspectJ的注解的方式)


    一、Spring的AOP的开发(AspectJ的注解的方式)

      ①、创建web项目,引入jar包

        

           AspectJ核心包:com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

      ②、编写目标类并配置交给Spring管理

    public class OrderDao {
        public void save() {
        System.out.println("保存订单...");
        }
    
        public void find() {
        System.out.println("查询订单...");
        int i=1/0;
        }
    
        public void update() {
        System.out.println("修改订单...");
        }
    
        public String delete() {
        System.out.println("删除订单...");
        return "delete";
        }
    }
    <bean id="order" class="com.xxx.spring.dao.OrderDao"/>

      ③、编写切面类并配置交给Spring管理

    public class AspectAnno {
        /**
         * 前置通知 获取切入点信息
         */
        public void before(JoinPoint joinPoint) {
        System.out.println("前置增强======" + joinPoint);
        }
    }
    <bean id="aspectAnno" class="com.xxx.spring.dao.AspectAnno"/>

      ④、使用注解的AOP对象目标类进行增强

        Ⅰ、在配置文件中打开注解的AOP开发

    <aop:aspectj-autoproxy/>

        Ⅱ、在切面类和其内部方法上注解

    @Aspect
    public class AspectAnno {
        /**
         * 前置通知 获取切入点信息
         * 指定增强的方法
       */
        @Before(value = "execution(* com.xxx.spring.dao.OrderDao.save(..))")
        public void before(JoinPoint joinPoint) {
        System.out.println("前置增强======" + joinPoint);
        }
    }

      ⑤、编写测试类

    @SpringJUnitConfig(locations = "classpath:bean.xml")
    public class SpringDemo {
        
        @Autowired
        private OrderDao orderDao;
    
        @Test
        public void demo2() {
        orderDao.save();
        orderDao.update();
        orderDao.delete();
        orderDao.find();
    
        }
    }

    二、Spring的注解的AOP的通知类型

      ①、@Before        :前置通知

        @Before(value = "execution(* com.xxx.spring.dao.OrderDao.save(..))")
        public void before(JoinPoint joinPoint) {
        System.out.println("前置通知 获取切入点信息======" + joinPoint);
        }

      ②、@AfterReturning:后置通知

        @AfterReturning(value = "execution(* com.xxx.spring.dao.OrderDao.delete(..))",returning = "result")
        public void writeLog(Object result) {
        System.out.println("后置通知 获取切入点返回值======" + result);
        }

      ③、@Around:环绕通知

        @Around(value = "execution(* com.xxx.spring.dao.OrderDao.update(..))")
        public Object checkPerformance(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("环绕通知 前  ======");
        // 获取切入点
        Object obj = joinPoint.proceed();
        System.out.println("环绕通知 后======");
        return obj;
        }

      ④、@AfterThrowing:异常抛出通知

        @AfterThrowing(value = "execution(* com.xxx.spring.dao.OrderDao.find(..))",throwing = "ex")
        public void afterThrowing(Throwable ex) {
        System.out.println("异常抛出通知 获取异常信息======" + ex.getMessage());
        }

      ⑤、@After:最终通知

        @After(value = "execution(* com.xxx.spring.dao.OrderDao.find(..))")
        public void after() {
        System.out.println("最终通知======");
        }

    以上的代码每个方法上都需要写value表达式(每个通知都配置了切入点的表达式),如果有多个通知上配置同一个切入点的话,我们就需要修改多次,解决方案:Spring的切入点的配置

    三、Spring的切入点的配置

    @Aspect
    public class AspectAnno {
    
        @Before(value = "pointcut_save()")
        public void before(JoinPoint joinPoint) {
        System.out.println("前置通知 获取切入点信息======" + joinPoint);
        }
    
        @AfterReturning(value = "pointcut_delete()",returning = "result")
        public void writeLog(Object result) {
        System.out.println("后置通知 获取切入点返回值======" + result);
        }
    
        @Around(value = "pointcut_update()")
        public Object checkPerformance(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("环绕通知 前  ======");
        // 获取切入点
        Object obj = joinPoint.proceed();
        System.out.println("环绕通知 后======");
        return obj;
        }
    
        @AfterThrowing(value = "pointcut_find()",throwing = "ex")
        public void afterThrowing(Throwable ex) {
        System.out.println("异常抛出通知 获取异常信息======" + ex.getMessage());
        }
    
        @After(value = "pointcut_find()")
        public void after() {
        System.out.println("最终通知======");
        }
        
        //切入点注解
        @Pointcut(value = "execution(* com.xxx.spring.dao.OrderDao.find(..))")
        private void pointcut_find() {}
        @Pointcut(value = "execution(* com.xxx.spring.dao.OrderDao.save(..))")
        private void pointcut_save() {}
        @Pointcut(value = "execution(* com.xxx.spring.dao.OrderDao.update(..))")
        private void pointcut_update() {}
        @Pointcut(value = "execution(* com.xxx.spring.dao.OrderDao.delete(..))")
        private void pointcut_delete() {}
    }
  • 相关阅读:
    【Docker】命令 start
    【Docker】命令 create
    【Docker】命令 docker
    【Docker】命令 pull
    【Docker】命令 search
    【Docker】命令 info
    【Docker】命令 version
    Java常用类——Random类
    Java常用类——BigInteger& BigDecimal
    Java常用类——Math类
  • 原文地址:https://www.cnblogs.com/WarBlog/p/14120617.html
Copyright © 2020-2023  润新知