zoukankan      html  css  js  c++  java
  • Spring的AOP基于AspectJ的注解方式开发2

    参考自黑马培训机构

    上一篇博客提到了在配置文件中开启aop的注解开发,以及简单使用了@Before,@Aspect 这是为了告诉spring为前置通知和切面类

    接下来介绍aop的注解的通知类型,和切入点的注解。参考自https://www.cnblogs.com/ltfxy/p/9885742.html

    Spring的注解的AOP的通知类型

    • @Before:前置通知
    • @AfterReturning:后置通知
    • @Around:环绕通知
    • @AfterThrowing:异常抛出通知
    • @After:最终通知
    • @Pointcut:切入点的注解

    切面类代码如下

    package spring.day2_aop2;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.AfterThrowing;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    
    /*
     * 编写切面类
     */
    @Aspect
    public class MyAspect {
        /*
         * 前置通知
         */
        @Before(value="execution(* spring.day2_aop2.OrderDao.save(..))")
        public void checkPri() {
            System.out.println("=============权限校验(前置通知)=============");
        }
        /*
         * 可以带返回值的后置通知
         */
        @AfterReturning(value="execution(* spring.day2_aop2.OrderDao.delete(..))",returning="result" )
        public void writeLog(Object result) {
            System.out.println("=============日志记录(后置通知)============="+result);
        }
        /*
         * 环绕通知
         */
        @Around(value="execution(* spring.day2_aop2.OrderDao.update(..))")
        public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
            System.out.println("==========环绕前增强============");
            Object proceed = joinPoint.proceed();
            System.out.println("==========环绕后增强============");
            return proceed;
        }
        /*
         * 异常抛出通知
         */
        @AfterThrowing(value="execution(* spring.day2_aop2.OrderDao.find(..))")
        public void afterThrowing(JoinPoint joinPoint) {
            System.out.println("==========异常抛出通知============"+joinPoint);
        }
    }

    目标类,配置文件,及测试类代码如下

    package spring.day2_aop2;
    /*
     * 编写目标类
     */
    public class OrderDao {
        
        public void save() {
            System.out.println("orderDao的save方法已经执行......");
        }
        public String delete() {
            System.out.println("orderDao的delete方法已经执行......");
            return "张三";
        }
        public void update() {
            System.out.println("orderDao的update方法已经执行......");
        }
        public void find() {
            System.out.println("orderDao的find方法已经执行......");
            int i=1/0;
        }
        
    }
    <?xml version="1.0" encoding="UTF-8"?>
    <!-- ===============================引入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">
            
            <!-- ====在注解文件里开启aop的开发===== -->
            <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
            
           <!-- 配置目标类 --> 
           <bean id="orderDao" class="spring.day2_aop2.OrderDao"></bean>
           
           <!-- 配置切面类 -->
           <bean id="myAspect" class="spring.day2_aop2.MyAspect"></bean>
           
            
    </beans>
    package spring.day2_aop2;
    
    import javax.annotation.Resource;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    /*
     * 编写测试类
     */
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext5.xml")
    public class SpringDemo1 {
    
        @Resource(name="orderDao")
        private OrderDao orderDao;
    
        @Test
        public void demo1() {
            orderDao.save();
            orderDao.delete();
            orderDao.update();
            orderDao.find();
        }
    }

    测试结果如下:

     补充:

    转载自https://www.cnblogs.com/yuwenlanleng/p/6704780.html

    AspectJ使用org.aspectj.lang.JoinPoint接口表示目标类连接点对象,如果是环绕增强时,使用org.aspectj.lang.ProceedingJoinPoint表示连接点对象,该类是JoinPoint的子接口。任何一个增强方法都可以通过将第一个入参声明为JoinPoint访问到连接点上下文的信息。我们先来了解一下这两个接口的主要方法: 
    1)JoinPoint 
     java.lang.Object[] getArgs():获取连接点方法运行时的入参列表; 
     Signature getSignature() :获取连接点的方法签名对象; 
     java.lang.Object getTarget() :获取连接点所在的目标对象; 
     java.lang.Object getThis() :获取代理对象本身; 
    2)ProceedingJoinPoint 
    ProceedingJoinPoint继承JoinPoint子接口,它新增了两个用于执行连接点方法的方法: 
     java.lang.Object proceed() throws java.lang.Throwable:通过反射执行目标对象的连接点处的方法; 
     java.lang.Object proceed(java.lang.Object[] args) throws java.lang.Throwable:通过反射执行目标对象连接点处的方法,不过使用新的入参替换原来的入参。

  • 相关阅读:
    Asp.Net MVC4 系列--进阶篇之路由 (2)
    Asp.Net MVC4 系列-- 进阶篇之路由(1)
    ASP.NET MVC AJAX的调用示例
    MVC中Controller控制器相关技术
    MVC中View界面数据呈现示例
    IEnumerable,ICollection,IList,List之间的区别
    Dapper数据库相关操作
    集合类---Map
    工厂模式
    适配器模式与外观模式
  • 原文地址:https://www.cnblogs.com/zengcongcong/p/10364890.html
Copyright © 2011-2022 走看看