1、引入依赖

    <!--spring aop依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>6.0.2</version>
</dependency>
<!--spring aspects依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>6.0.2</version>
</dependency>

2、定义接口和实现类

public interface Calculator {
int add(int a,int b);
int sub(int a,int b);
int mul(int a,int b);
int div(int a,int b);
}
public class CalculatorImpl implements Calculator{
@Override
public int add(int a, int b) {
int res = a+b;
System.out.println("res:"+res);
return res;
} @Override
public int sub(int a, int b) {
int res = a-b;
System.out.println("res:"+res);
return res;
} @Override
public int mul(int a, int b) {
int res = a*b;
System.out.println("res:"+res);
return res;
} @Override
public int div(int a, int b) {
int res = a/b;
System.out.println("res:"+res);
return res;
}
}

3、配置类

@Configuration
@ComponentScan(value = "com.jixian")
@EnableAspectJAutoProxy
public class SpringConfig {
}

4、切面类

@Aspect
@Component
public class AspectLog { @Before(value = "execution(public int com.jixian.CalculatorImpl.*(..))")
public void beforeMethod(){
System.out.println("前置通知...");
}
@After(value = "execution(* com.jixian.CalculatorImpl.*(..))")
public void afterMethod(){
System.out.println("后置通知...");
}
@AfterReturning(value = "execution(* com.jixian.CalculatorImpl.*(..))")
public void afterReturn(){
System.out.println("返回通知...");
}
@AfterThrowing(value = "execution(* com.jixian.CalculatorImpl.*(..))")
public void throwMethod(){
System.out.println("异常通知...");
}
@Around(value = "execution(* com.jixian.CalculatorImpl.*(..))")
public Object aroundMethod(ProceedingJoinPoint joinPoint){
Object o = null;
try {
System.out.println("环绕通知...方法执行前");
o = joinPoint.proceed();
System.out.println("环绕通知...返回值后");
} catch (Throwable throwable) {
throwable.printStackTrace();
System.out.println("环绕通知...出现异常");
} finally {
System.out.println("环绕通知...方法执行后");
}
return o;
}
}

5、测试

        ApplicationContext context = new AnnotationConfigApplicationContext("com.jixian");
Calculator calculator = context.getBean(Calculator.class);
calculator.div(12,1);

基于注解的AOP的更多相关文章

  1. Spring_Spring与AOP_AspectJ基于注解的AOP实现

    一.AspectJ.Spring与AOP的关系 AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Cl ...

  2. Spring基础知识之基于注解的AOP

    背景概念: 1)横切关注点:散布在应用中多处的功能称为横切关注点 2)通知(Advice):切面完成的工作.通知定了了切面是什么及何时调用. 5中可以应用的通知: 前置通知(Before):在目标方法 ...

  3. spring中基于注解使用AOP

    本文内容:spring中如何使用注解实现面向切面编程,以及如何使用自定义注解. 一个场景 比如用户登录,每个请求发起之前都会判断用户是否登录,如果每个请求都去判断一次,那就重复地做了很多事情,只要是有 ...

  4. AspectJ框架基于注解的AOP实现

    AspectJ的AOP实现:有两种方式,一种是基于XML配置文件,一种是基于注解的,由于注解更为常用,这里 这里只针对注解来学习. ---------------------------------- ...

  5. 阶段3 2.Spring_08.面向切面编程 AOP_9 spring基于注解的AOP配置

    复制依赖和改jar包方式 src下的都复制过来. 复制到新项目里了 bean.xml里面复制上面一行代码到下面.把aop改成context. 配置spring容器创建时要扫描的包 Service的配置 ...

  6. springboot自定义jdbc操作库+基于注解切点AOP

    发布时间:2018-11-08   技术:springboot+aop   概述 springBoot集成了自定义的jdbc操作类及AOP,因为spring自带的JdbcTemplate在实际项目中并 ...

  7. Spring AspectJ基于注解的AOP实现

    对于AOP这种编程思想,很多框架都进行了实现.Spring就是其中之一,可以完成面向切面编程.然而,AspectJ也实现了AOP的功能,且实现方式更为简捷,使用更加方便,而且还支持注解式开发.所以,S ...

  8. Spring 基于注解的AOP实现

    在本文开始之前,我要引入一张图,这张图的来源 https://blog.csdn.net/chenyao1994/article/details/79708496 ,版权归原作者所有,我借鉴了原作者的 ...

  9. 基于注解的AOP配置

    配置文件 spring配置文件中的约束 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns ...

  10. 阶段3 2.Spring_10.Spring中事务控制_2 作业-基于注解的AOP实现事务控制及问题分析_上

    创建maven的新项目 先复制坐标的依赖. 再把代码复制进来 先改造ioc的部分 复制上面一行代码.到下面 改成context 这里也是复制的上面两行代码.到下面改成context关键字 配置扫描的包 ...

随机推荐

  1. NETAPP 设备 C模式开关机顺序

    设备正常开关机顺序开机顺序: 1.开启所有磁盘柜的电源,大概20秒后再开启存储控制器: 2.开启接有FAS2750存储的以太网交换机或者光纤交换机: 3.开启有挂载FAS2750存储空间的服务器或者磁 ...

  2. 【Go语言基础】slice

    一.概述 数组(Array)的长度在定义之后无法再次修改:数组是值类型,每次传递都将产生一份副本. 显然这种数据结构无法完全满足开发者的真实需求.Go语言提供了数组切片(slice)来弥补数组的不足. ...

  3. CCRD_TOC_2008年第7和第8期(ACR专辑)

    中信国健临床通讯 2008年第7.第8期合刊 ACR专辑 目 录   强直性脊柱炎 1. 一项随机对照和开放性延伸期试验:TNF拮抗剂治疗放射学前中轴型脊柱关节病 Boettger MK, et al ...

  4. 代码随想录算法训练营day24 | leetcode 77. 组合

    基础知识 回溯法解决的问题都可以抽象为树形结构,集合的大小就构成了树的宽度,递归的深度构成的树的深度 void backtracking(参数) { if (终止条件) { 存放结果; return; ...

  5. Linux 用户组管理

    用户组 群组是大家都熟悉的东西,群组有群主,也就是创建者.群管理员有一定的管理权限,比如上传群文件.管理成员等权限:群成员也有一定的权限,比如下载群文件. 私有组 一般来说,每一个用户都有自己的一个初 ...

  6. 【MySQL速通篇001】5000字吃透MySQL部分重要知识点

    写在前面 这篇5000多字博客也花了我几天的时间,主要是我对MySQL一部分重要知识点的理解[后面当然还会写博客补充噻,欢迎关注我哟],当然这篇文章可能也会有不恰当的地方[毕竟也写了这么多字,错别字可 ...

  7. ionic混合开发总结之调用手机相机

    整理一下,给接触ionic的伙伴们一些参考,少走弯路. 调用手机的前提是已经成功创建了项目. 首先,要下载两个插件,一个是 cordova-plugin-camera,是调用相机的插件,还有一个是Ng ...

  8. django搭建简易blog

    目录 下载安装django 创建一个django项目 创建一个django应用 models.py urls.py views.py admin.py 配置应用到项目下 路由设置urls.py set ...

  9. linux命令行大量零碎练习习题集-打包未整理

    linux命令行大量零碎练习习题集-打包未整理最近看完了一本linux书籍,想着做题来检测和巩固一下,于是打算去买本linux命令集习题去做做.但是没有找到相关的书籍,于是只能在网上随便找找.但是很多 ...

  10. allure安装配置

    代理节点配置allure 下载allure https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline 配置环境变 ...