1.引入AOPjar包文件

         <!--引入AOPjar包文件--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

2.AOP介绍

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

总结: Spring中的AOP 利用代理对象在不修改源代码的条件下,对方法进行扩展.

一句话:

动态代理执行力目标方法,并且对目标方法进行了扩充,称为切面

入门案例

编辑配置类

package com.jt.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;@Configuration
@ComponentScan("com.jt")
@EnableAspectJAutoProxy//启用AOP
public class SpringConfig {}

编辑切片类

package com.jt.aop;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;@Component//将该类交给容器管理
@Aspect //标识该
public class SpringAop {/*** 公式:切面=切入点表达式+通知方法* 切入点表达式:如果目标对象满足切入点表达式的判断(if),则spring自动为其创建代理对象* 通知方法:对目标方法进行扩展的封装方法* 目标对象的beanID:userServiceImpl* 切入点表达式:*      1.bean("bean的id")* AOP规则;* */@Pointcut("bean(userServiceImpl)")public void pointcut(){}//1.前置通知:在目标方法执行之前执行@Before("pointcut()")public void before(){System.out.println("我是前置通知");}//    2.后置通知:在目标方法执行之后执行@AfterReturning("pointcut()")public void afterReturn(){System.out.println("我是后置通知");}//3.异常通知:目标方法执行报错时,执行该通知@AfterThrowing("pointcut()")public void afterThrowing(){System.out.println("我是异常通知");}//4.最终通知:目标方法之后都要执行的通知@After("pointcut()")public void after(){System.out.println("最终通知都要执行");}//5.重点掌握 环绕通知:在目标方法执行前后都要执行,控制目标方法@Around("pointcut()")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("环绕通知执行前");//底层调用动态代理的invoke方法,执行目标方法Object result = joinPoint.proceed();System.out.println("环绕通知执行后");return result;}
}

编辑测试类

package com.jt;import com.jt.config.SpringConfig;
import com.jt.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class TestSpring {@Testpublic void TestDemo1(){ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);UserService userService = context.getBean(UserService.class);//获取代理对象System.out.println(userService.getClass());userService.addUser();}
}

AOP表达式

bean标签

  • 说明:根据bean的id拦截指定对象
  • 语法:@Pointcut(“bean(userServiceImpl)”)
    public void pointcut(){
    }

within标签

  • 语法:按照类型匹配,可以使用通配符*
  • 说明:
  • @Pointcut(“within(com.jt.service.UserServiceImpl)”)
    只扫描UserServiceImpl类
  • 2.@Pointcut(“within(com.jt.service.*)”)
    扫描service包的一级类
  • 3@@Pointcut(“within(com.jt.service…*)”)
    扫描service包下的所有类
  • 4@@Pointcut(“within(com.jt.service…*)”)
    扫描任意包下service包下的所有类

上述两种操作方式粒度较粗,一般不用。

execution表达式

  • execution(返回值类型 包名类名方法名(参数列表))
    @Pointcut(“execution(* com.jt.service.UserServiceImpl.addUser())”)
  • execution(返回值类型 包名类名下所有类的所有方法(所有参数))
    @Pointcut(“execution(* com.jt.service….(…))”)
  • execution(返回值类型 包名类名下所有类中的add开头的方法,且参数只有一个int类型 进行拦截(所有参数))
    @Pointcut(“execution(* com.jt.service…add.(int))”)

@annotation表达式
作用: 可以根据用户的自定义注解进行拦截

  • 完成注解类
package com.jt.anno;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)//注解运行期有效
@Target(ElementType.METHOD)//注解标识方法
public @interface Wxin {}
  • 标识注解
@Pointcut("@annotation(com.jt.anno.Wxin)")

Spring--AOP知识学习相关推荐

  1. Spring AOP 知识整理

    为什么80%的码农都做不了架构师?>>>    AOP知识整理 面向切面编程(AOP)通过提供另外一种思考程序结构的途经来弥补面向对象编程(OOP)的不足.在OOP中模块化的关键单元 ...

  2. Spring AOP知识详解

    本文来详细说下spring中的aop内容 文章目录 Spring AOP概述 Spring AOP一代 Pointcut Jointpoint Advice Advisor 织入 Spring AOP ...

  3. Spring AOP知识总结

    文章目录 1.AOP(面向切面编程思想) 1.1概念 1.2核心概念 1.3AOP的通知类型 2.AOP的实现原理和场景 2.1场景 2.2实现技术 3.Spring AOP的两种代理模式 3.1JD ...

  4. Spring AOP体系学习

    为什么80%的码农都做不了架构师?>>>    要理解AOP整体的逻辑需要理解一下Advice,Pointcut,Advisor的概念以及他们的关系.  Advice是为Spring ...

  5. @RequestParam 注解的使用——Spring系列知识学习笔记

    一. 前言 在SpringMVC后台进行获取数据,一般是两种. request.getParameter("参数名") 用@RequestParam注解获取 下面讲解用法. 二. ...

  6. Spring AOP详细介绍

    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...

  7. Spring AOP 快速入门

    文章目录 一. 什么是Spring AOP 二. 为什么要学习Spring AOP 三. 学习 Spring AOP 3.1 AOP 的组成 3.1.1 切面 (Aspect) 3.1.2 切点 (P ...

  8. Spring原理学习系列之三:Spring AOP原理(从源码层面分析)-------上部

    引言 本文是Spring原理分析的第三篇博文,主要阐述Spring AOP相关概念,同时从源码层面分析AOP实现原理.对于AOP原理的理解有利于加深对Spring框架的深入理解.同时我也希望可以探究S ...

  9. 在Intellij上面导入项目 AOP示例项目 AspectJ学习 Spring AoP学习

    为了学习这篇文章里面下载的代码:http://www.cnblogs.com/charlesblc/p/6083687.html 需要用Intellij导入一个已有工程.源文件原始内容也可见:link ...

  10. spring源码学习之路---深入AOP(终)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章和各位一起看了一下sp ...

最新文章

  1. 图形数据库Neo4j基本了解
  2. 关于jquery.AutoComplete插件的一些使用心得(编码问题,效率问题)
  3. flask 开发接口测试平台
  4. matlab colorbar采用对数,matlab colorbar的使用 | 學步園
  5. 爬取B站免费视频--python代码赶快拿
  6. c语言sqlserver进行odbc编程,在VS下用C语言连接SQLServer2008
  7. EXTJS 双层表头 记录
  8. PolarDB-X 云原生分布式数据库 > API参考 > API参考(2017版本) > 数据库管理类 API > 删除 DRDS 数据库
  9. php微信关键词回复,php微信开发之关键词回复功能
  10. 玩转Kinetis之教你将K60主频超到200MHz以上
  11. 高等数学(第七版)同济大学 习题8-1 个人解答
  12. 数字功放芯片的工作原理以及应用领域
  13. iphone通讯录备份怎么导出来
  14. 万豪国际扩大北京奢华酒店布局,JW万豪将落户东城区
  15. 青少年编程教育等级评测(一级)模拟题_1
  16. mysql:列类型之时间日期
  17. python程序网站_Python程序到网站应用程序
  18. Java 这一年都经历了什么?
  19. Jersey 开发RESTful(九)Jersey中的注入
  20. 时间戳与日期格式转换

热门文章

  1. seaborn画分组箱线图
  2. win7开机卡在正在启动_电脑重装了系统,却卡在图标截面
  3. python熊猫图案_熊猫备忘单–适用于数据科学的Python
  4. F. Equalize the Array(思维+前缀和)
  5. Cyberpunk!特斯拉发布皮卡,造型雷翻众人
  6. 2018 NOIP 普及组
  7. 有同学问我Java工程师怎么入门?我马上甩出C认证模拟测试推荐给他!
  8. oracle数据库语句
  9. [转][晓月风瑟推荐]值得用一生来品味的100句凡人语录
  10. matlab 纵向的虚线,纵向减速标记符号中间是虚线可以变道吗