AOP即面向切面编程。它的底层实际是用了spring的动态代理,具体是JDK的代理还是CGLIB的代理,就视情况而定了。本博客园仅仅作为平时记录,显得有些杂乱无章,如果想了解动态代理,设计模式,请访问我的个人博客

1. 首先引入aop的jar包

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

2. 被切的业务类

/**
* description
*
* @author 70KG
* @date 2018/7/30
*/
public class BusinessCalculate { public int calculate(int i, int j) {
int result = i / j;
System.out.println("BusinessCalculate-业务方法执行。。。。。。");
return result;
} }

3. 编写切面类

前置切面类:

/**
* description
*
* @author 70KG
* @date 2018/7/30
*/
@Aspect
public class BeforeAdvice { // 前置通知
@Before("com.nmys.story.springCore.springaop.test01.SystemArchitecture.pointCut()")
public void logBefore(JoinPoint joinPoint) {
// 获取传入的参数
Object[] args = joinPoint.getArgs();
for (int i = 0; i < args.length; i++) {
System.out.println("傳入的參數:" + args[i]);
}
System.out.println("调用方法之前执行logBefore。。。。。。");
} }

后置切面类:

/**
* description
*
* @author 70KG
* @date 2018/7/30
*/
@Aspect
public class AfterAdvice { // 后置通知
@After("com.nmys.story.springCore.springaop.test01.SystemArchitecture.pointCut()")
public void logAfter() {
System.out.println("调用方法之后执行logAfter。。。。。。");
} }

切点类(为的提取公共切点):

/**
* description 用来定义切入点的类
*
* @author 70KG
* @date 2018/7/30
*/
public class SystemArchitecture { @Pointcut("bean(*domCalculate)")
public void definitionPointCut(){} // execution(* *(..)) 所有方法
// 抽取公共表达式
// @Pointcut("execution(public int com.nmys.story.springCore.aopdemo.BusinessCalculate.*(..))")
@Pointcut("execution(* com.nmys.story.springCore.springaop.test01.BusinessCalculate.*(..))")
// @Pointcut("bean(*Calculate)")
public void pointCut() {} }

4.编写配置类

最重要的是要开启aop注解@EnableAspectJAutoProxy

/**
* @author 70KG
* @Title: Config
* @Description: 配置类
* @date 2018/7/29下午2:01
* @From www.nmyswls.com
*/
@Configuration
// 手动开启Aspect注解
@EnableAspectJAutoProxy
public class AopConfig { // 将@Aspect修饰的类和业务类都交给spring来管理
@Bean
public BeforeAdvice beforeAdvice() {
return new BeforeAdvice();
} @Bean
public AfterAdvice afterAdvice() {
return new AfterAdvice();
} @Bean
public BusinessCalculate businessCalculate() {
return new BusinessCalculate();
} }

5. 测试

/**
* @author 70KG
* @Title: MainTest
* @Description:
* @date 2018/7/29下午2:01
* @From www.nmyswls.com
*/
public class MainTest { public static void main(String[] args) {
// 加载配置文件
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AopConfig.class);
BusinessCalculate businessCalculate = ac.getBean(BusinessCalculate.class);
System.out.println("===================================================");
int result1 = businessCalculate.calculate(10, 5);
System.out.println("計算結果:" + result1);
System.out.println("===================================================");
// RandomCalculate randomCalculate = ac.getBean(RandomCalculate.class);
// int result2 = randomCalculate.calculate(10, 5);
// System.out.println("計算結果:" + result2);
} }

6. 结果

===================================================
傳入的參數:10
傳入的參數:5
调用方法之前执行logBefore。。。。。。
BusinessCalculate-业务方法执行。。。。。。
调用方法之后执行logAfter。。。。。。
計算結果:2
===================================================

Spring源码窥探之:Spring AOP初步使用的更多相关文章

  1. Spring源码窥探之:AOP注解

    AOP也就是我们日常说的@面向切面编程,看概念比较晦涩难懂,难懂的是设计理念,以及这样设计的好处是什么.在Spring的AOP中,常用的几个注解如下:@Aspect,@Before,@After,@A ...

  2. Spring源码-IOC部分-Spring是如何解决Bean循环依赖的【6】

    实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...

  3. spring源码学习之路---AOP初探(六)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 最近工作很忙,但当初打算学习 ...

  4. 框架源码系列六:Spring源码学习之Spring IOC源码学习

    Spring 源码学习过程: 一.搞明白IOC能做什么,是怎么做的  1. 搞明白IOC能做什么? IOC是用为用户创建.管理实例对象的.用户需要实例对象时只需要向IOC容器获取就行了,不用自己去创建 ...

  5. spring源码深度解析—Spring的整体架构和环境搭建

    概述 Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.Spring是于2003 年兴起的一个轻量级的Java 开发框 ...

  6. spring源码学习(三)--spring循环引用源码学习

    在spring中,是支持单实例bean的循环引用(循环依赖)的,循环依赖,简单而言,就是A类中注入了B类,B类中注入了A类,首先贴出我的代码示例 @Component public class Add ...

  7. Spring 源码学习(4) —— 动态AOP使用示例

    在实际工作中, 此bean可能是满足业务需要的核心逻辑, 例如test()方法中可能会封装着某个核心业务, 如果在test()方法前后加入日志来跟踪调试, 直接修改源码并不符合面向对象的设计模式, 而 ...

  8. Spring源码剖析7:AOP实现原理详解

    前言 前面写了六篇文章详细地分析了Spring Bean加载流程,这部分完了之后就要进入一个比较困难的部分了,就是AOP的实现原理分析.为了探究AOP实现原理,首先定义几个类,一个Dao接口: pub ...

  9. Spring源码分析:Spring IOC容器初始化

    概述: Spring 对于Java 开发来说,以及算得上非常基础并且核心的框架了,在有一定开发经验后,阅读源码能更好的提高我们的编码能力并且让我们对其更加理解.俗话说知己知彼,百战不殆.当你对Spri ...

  10. (转) Spring源码阅读 之 Spring整体架构

    标签(空格分隔): Spring 声明:本文系转载,原地地址:spring framework 4 源码阅读 Spring骨架 Spring的骨架,也是Spring的核心包.主要包含三个内容 cont ...

随机推荐

  1. python random模块(14)

    random 模块包括返回随机数的函数,可以用于模拟或者任何产生随机输出的程序. 一.random模块常用函数介绍 random.random() — 生成一个从0.0(包含)到 1.0(不包含)之间 ...

  2. VMware vSphere6.0 服务器虚拟化部署安装图解(最全,最详细)-搭建的所有步骤

    VMware vSphere6.0 服务器虚拟化部署安装图解 一 .VMware vSphere部署的前期规划要点 1.vSphere的优点 (略) 2如何利用现在的设备架构虚拟化环境 在虚拟化过程中 ...

  3. Kafka Streams | 流,实时处理和功能

    1.目标 在我们之前的Kafka教程中,我们讨论了Kafka中的ZooKeeper.今天,在这个Kafka Streams教程中,我们将学习Kafka中Streams的实际含义.此外,我们将看到Kaf ...

  4. pymysql 模块简单使用

    目录 pymysql 模块简单使用 安装 pymysql 模块 使用 pymysql 连接数据库 并插入数据 使用pymysql 插入数据 修改查询显示结果 pymysql 模块简单使用 安装 pym ...

  5. kubernetes 实践三:使用kubeadm安装k8s1.16.0

    环境版本说明: 三台vmware虚拟机,系统版本CentOS7.6. Kubernetes 1.16.0,当前最新版. flannel v0.11 docker 18.09 使用kubeadm可以简单 ...

  6. JavaScript是单线程还是多线程(转)

    多线程要考虑线程之间的资源抢占,死锁,冲突之类一系列问题.JavaScript作为一门客户端脚本,貌似没有多线程的一些列问题.那么JavaScript是单线程还是多线程?通过查资料总结了JavaScr ...

  7. 未能加载文件或程序集system.web.extensions解决方法

    发现未能加载文件或程序集的错误,这是由于我的机器上没有安装Ajax的原因.问题解决后,整理如下:表现:1."System.Web.Extensions, Version=1.0.61025.0, Cu ...

  8. spring boot 集成mybatis plus 含分页 完整教程

    一.添加依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus ...

  9. iOS - 小功能 跳转到淘宝或天猫的商品展示详情页

    最近做iOS项目的时候遇到一个需求,点击广告页,跳转到淘宝或天猫的商品详情页. 具体需要是这样: 1)安装了淘宝:跳转到淘宝详情页. 2)没装淘宝,装了天猫:跳转到天猫详情页 3)淘宝.天猫都没装:跳 ...

  10. js点击按钮复制内容到粘贴板

    复制内容到粘贴板,就是要选择需要复制的内容并执行document.execCommand("copy")命令: //复制内容到粘贴板 function copyToClipboar ...