当前位置: 首页 > news >正文

SSM-Spring-17:Spring中aspectJ注解版

 

 

 

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------

 

 

 

AspectJ

 

  AspectJ是一个面向切面的框架,它扩展了Java语言,定义了AOP 语法,能够在编译期提供代码的织入

 

       @AspectJAspectJ 5新增的功能,使用JDK 5.0 注解技术和正规的AspectJ切点表达式语言描述切面

 

       Spring通过集成AspectJ实现了以注解的方式定义增强类,大大减少了配置文件中的工作量

 

       使用@AspectJ,首先要保证所用的JDK 5.0或以上版本

 

注解版案例:

  一个接口,一个类,一个普通类,实现注解的

 

  ISomeService接口:

 

package cn.dawn.day19aspectj;

/**
 * Created by Dawn on 2018/3/8.
 */
public interface ISomeService {
    public void insert();
    public void delete();
    public void select();
    public void update();
}

 

  SomeServiceImpl类,上面那个的实现类

 

package cn.dawn.day19aspectj;



/**
 * Created by Dawn on 2018/3/8.
 */
public class SomeServiceImpl implements ISomeService {

    public void insert() {
        System.out.println("insert ok");
    }

    public void delete() {
        System.out.println("delete ok");

    }

    public void select() {
        System.out.println("select ok");

    }

    public void update() {
        System.out.println("update ok");
        int a=5/0;
        System.out.println(a);

    }
}

 

  他有一个方法中模拟了除零的算数异常,方便一会测试异常增强:

  刚才我说的那个实现aspectj注解的类

 

package cn.dawn.day19aspectj;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

/**
 * Created by Dawn on 2018/3/12.
 */
@Aspect
public class MyAspectJ {

    /*单独拎出来的注解,一会下面用他的方法名可以调用到他的切点表达式*/
    @Pointcut(value = "execution(* *..day19aspectj.*.select(..))")
    public void select(){

    }
    @Pointcut(value = "execution(* *..day19aspectj.*.update(..))")
    public void update(){

    }

    /*后置增强*/
    @AfterReturning("execution(* *..day19aspectj.*.select(..))")
    public void myAfterReturning(){
        System.out.println("后置增强");
    }

    /*前置增强*/
    @Before("execution(* *..day19aspectj.*.insert(..))")
    public void myBefore(){
        System.out.println("前置增强");
    }

    /*异常增强*/
    @AfterThrowing("execution(* *..day19aspectj.*.update(..))")
    public void myAfterThrowing(){
        System.out.println("异常增强");
    }

    /*最终增强*//*
    @After("execution(* *..day19aspectj.*.update(..))||execution(* *..day19aspectj.*.select(..))")
    public void myafter(){
        System.out.println("我是最终增强");
    }*/

    /*最终增强*/
    @After("update()||select()")
    public void myafter(){
        System.out.println("我是最终增强");
    }

    /*环绕增强*/
    @Around("execution(* *..day19aspectj.*.insert(..))")
    public void myAround(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("环绕增强前");
        pjp.proceed();
        System.out.println("环绕增强后");
    }
}

 

  此处要说的只有一个他匹配的时候想要传入多个条件,符合任意一个就对方法增强,只需要用||逻辑或来分割,他上面我多写了一种方式,可以把切点表达式提出来,下面都可以使用,有点像提前声明,而不是用到的时候再声明的感觉

 

  单测方法:

 

package cn.dawn.day19aspectj;


import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created by Dawn on 2018/3/3.
 */
public class test20180312 {
    @Test
    /*aop代理工厂bean异常增强*/
    public void t01(){
        ApplicationContext context=new ClassPathXmlApplicationContext("ApplicationContext-day19aspectj.xml");
        ISomeService service = (ISomeService) context.getBean("service");

        try {
            service.update();
        }catch (Exception e){
            e.printStackTrace();
        }
        service.delete();
        service.select();
        service.insert();

    }
}

 

  我知道这块比较繁琐,不太好用语言解释,多练,毕竟博客的方式不如现场和视频,直播等,多练,练的时候理解

 

相关文章:

  • 前端Sass回顾以及Compass入门小记
  • ArchSummit2018深圳站筹备中,18大专题征集演讲嘉宾
  • Netty(十八)(中级篇)心跳连接
  • Android7.0以后跨应用
  • 手机零部件下半年持续缺货 供应商涨价趋势加剧
  • 1005. 继续(3n+1)猜想 (25)
  • [UWP小白日记-1]判断APP是否是第一次运行初始化SQLITE数据库
  • 微服务的4个设计原则和19个解决方案
  • 阿里云Redis开发规范
  • SEMI-PARAMETRIC TOPOLOGICAL MEMORY FOR NAVIGATION
  • StringUtils方法
  • java自定义注解
  • 排序算法之--选择排序
  • Shell脚本(2)-if语句
  • spring security reactive获取security context
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • Javascript弹出层-初探
  • node-glob通配符
  • October CMS - 快速入门 9 Images And Galleries
  • PAT A1017 优先队列
  • python3 使用 asyncio 代替线程
  • Python学习笔记 字符串拼接
  • scrapy学习之路4(itemloder的使用)
  • underscore源码剖析之整体架构
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 高性能JavaScript阅读简记(三)
  • 软件开发学习的5大技巧,你知道吗?
  • 学习ES6 变量的解构赋值
  • ​linux启动进程的方式
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • #图像处理
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (70min)字节暑假实习二面(已挂)
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (一)插入排序
  • .“空心村”成因分析及解决对策122344
  • .cfg\.dat\.mak(持续补充)
  • .gitignore文件---让git自动忽略指定文件
  • .NET 8.0 发布到 IIS
  • .Net Core和.Net Standard直观理解
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET与 java通用的3DES加密解密方法
  • .Net中间语言BeforeFieldInit
  • .sh
  • @RequestMapping处理请求异常
  • [ C++ ] STL---stack与queue
  • [Android]常见的数据传递方式
  • [C#] 如何调用Python脚本程序
  • [C#][opencvsharp]opencvsharp sift和surf特征点匹配
  • [cocos creator]EditBox,editing-return事件,清空输入框
  • [COI2007] Sabor