zoukankan      html  css  js  c++  java
  • 五、AOP入门

    AOP:【动态代理】

    指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式;

    一、导入aop模块;Spring AOP:(spring-aspects)

         <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
                <version>4.3.12.RELEASE</version>
            </dependency>

    二、定义一个业务逻辑类(MathCalculator)

    在业务逻辑运行的时候将日志进行打印(方法之前、方法运行结束、方法出现异常,xxx)

    public class MathCalculator {
        
        public int div(int i,int j){
            System.out.println("MathCalculator...div...");
            return i/j;    
        }
    }

    三、定义一个日志切面类(LogAspects):

      切面类里面的方法需要动态感知MathCalculator.div运行到哪里然后执行;

      通知方法:

      • 前置通知(@Before):logStart:在目标方法(div)运行之前运行
      • 后置通知(@After):logEnd:在目标方法(div)运行结束之后运行(无论方法正常结束还是异常结束)
      • 返回通知(@AfterReturning):logReturn:在目标方法(div)正常返回之后运行
      • 异常通知(@AfterThrowing):logException:在目标方法(div)出现异常以后运行
      • 环绕通知(@Around):动态代理,手动推进目标方法运行(joinPoint.procced())’
    • 给切面类的目标方法(div方法)标注何时何地运行(通知注解);
    • 将切面类和业务逻辑类(目标方法所在类)都加入到容器中;
    • 必须告诉Spring哪个类是切面类(给切面类上加一个注解:@Aspect)
    • 给配置类中加 @EnableAspectJAutoProxy 【开启基于注解的aop模式】
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    @Aspect
    public class LogAspects {
        
        //抽取公共的切入点表达式
        //1、本类引用
        //2、其他的切面引用
        @Pointcut("execution(public int com.atguigu.aop.MathCalculator.*(..))")
        public void pointCut(){};
        
        //@Before在目标方法之前切入;切入点表达式(指定在哪个方法切入)
        @Before("pointCut()")
        public void logStart(JoinPoint joinPoint){
            Object[] args = joinPoint.getArgs();
            System.out.println(""+joinPoint.getSignature().getName()+"运行。。。@Before:参数列表是:{"+Arrays.asList(args)+"}");
        }
        
        @After("com.atguigu.aop.LogAspects.pointCut()")
        public void logEnd(JoinPoint joinPoint){
            System.out.println(""+joinPoint.getSignature().getName()+"结束。。。@After");
        }
        
        //JoinPoint一定要出现在参数表的第一位
        @AfterReturning(value="pointCut()",returning="result")
        public void logReturn(JoinPoint joinPoint,Object result){
            System.out.println(""+joinPoint.getSignature().getName()+"正常返回。。。@AfterReturning:运行结果:{"+result+"}");
        }
        
        @AfterThrowing(value="pointCut()",throwing="exception")
        public void logException(JoinPoint joinPoint,Exception exception){
            System.out.println(""+joinPoint.getSignature().getName()+"异常。。。异常信息:{"+exception+"}");
        }

    测试

    @Test
        public void test01(){
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAOP.class);
            
            //1、不要自己创建对象
    //        MathCalculator mathCalculator = new MathCalculator();
    //        mathCalculator.div(1, 1);
            MathCalculator mathCalculator = applicationContext.getBean(MathCalculator.class);
            
            mathCalculator.div(1, 0);
            
            applicationContext.close();
        }

    AOP的使用步骤:三步:

    • 将业务逻辑组件和切面类都加入到容器中;告诉Spring哪个是切面类(@Aspect)

    • 在切面类上的每一个通知方法上标注通知注解,告诉Spring何时何地运行(切入点表达式)

    • 开启基于注解的aop模式;@EnableAspectJAutoProxy

  • 相关阅读:
    CSS自动控制图片大小的代码
    JS 判断 Radio 单选按钮是否为选中状态 并弹出 值信息
    [转]eclipse github 提交代码
    WEB 开发工具分享
    javaShop的一些总结
    前端进阶试题(css部分)
    如何判断浏览器 然后针对不同的浏览器加入单独的样式
    jquery 提示信息显示后自动消失的具体实现
    html a标签 图片边框和点击后虚线框的有关问题
    html 包含一个公共文件
  • 原文地址:https://www.cnblogs.com/jdy1022/p/14006178.html
Copyright © 2011-2022 走看看