文章目录

  • Spirng之AOP
    • 1 AOP的基本原理
      • 1.1 AOP底层使用动态代理
      • 1.2 使用JDK动态代理,使用Proxy类里面的方法创建代理对象
    • 2 AOP概念
    • 2.2 AOP操作准备

Spirng之AOP

Aspect Oriented Programming 意为:面向切面编程
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率

通俗的讲,不通过修改源代码方式,在主干功能里面添加新功能。

1 AOP的基本原理

1.1 AOP底层使用动态代理

第一种有接口情况下,使用JDK动态代理

1.2 使用JDK动态代理,使用Proxy类里面的方法创建代理对象

  1. 调用newProxyInstance(ClassLoader lodeer, 类<?>[] interfaces, InvocationHandler h) 方法
    三个参数
    第一个参数 类加载器
    第二个参数 增强方法所在的类,这个类实现的接口,支持多个接口。
    第三个参数 实现这个接口InvocationHandler。创建代理对象,写增强的方法。

  2. 创建接口

public interface UserDao {public int add(int a, int b);public String update(String id);
}
  1. 创建接口的实现类
public class UserDaoImpl implements UserDao {@Overridepublic int add(int a, int b) {System.out.println("add.....");return a + b;}@Overridepublic String update(String id) {System.out.println("update......");return id;}
}
  1. 使用Proxy类创建接口代理对象
public class JDKProxy {public static void main(String[] args) {//创建接口实现类的代理对象Class[] interfaces = {UserDao.class};UserDaoImpl userDao = new UserDaoImpl();UserDao userDao1 = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));int add = userDao1.add(1, 2);System.out.println("result :" + add);}
}class UserDaoProxy implements InvocationHandler{private Object obj;public UserDaoProxy(Object obj){this.obj = obj;}//增强的逻辑@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//方法之前System.out.println("before....." + method.getName() + "传递的参数" + Arrays.toString(args));Object res = method.invoke(obj, args);//方法之后System.out.println("方法之后执行..." + obj);return res;}before.....add传递的参数[1, 2]
add.....
方法之后执行...com.itheima.jdk.UserDaoImpl@2b193f2d
result :3

2 AOP概念

  1. JointPoint 连接点
    哪些方法可以被增强。这些方法称为连接点。

  2. 切入点
    实际被真正增强的方法。 称为切入点

  3. 通知 - 增强
    实际增强的逻辑部分称为通知(增强)
    3.1 多种类型

    • 前置通知
    • 后置通知
    • 环绕通知
    • 异常通知
    • 最终通知 @After finally
  4. 切面
    把通知应用到切入点的过程行为。

2.2 AOP操作准备

  1. Spring一般基于AspectJ实现AOP操作。
    1.1 什么是AspectJ ?
    AspectJ不是Spring组成部分,独立AOP框架。一般和Sping框架一起使用,进行AOP操作。

  2. 基于AspectJ实现AOP操作

    • 基于xml配置文件实现
    • 基于注解方式实现 常用
  3. 切入点表达式
    作用:知道对那个类里面的那个方法进行增强。

  • 语法结构 execution( [权限修饰符] [返回类型] [方法名称] ([参数列表]))

3.1 对com.slxy.dao.bookDao类里面的add方法进行增强
execution(* com.slxy.dao.bookDao.add(…))

3.2 对com.slxy.dao.bookDao类里面的所有方法进行增强
execution(* com.slxy.dao.bookDao.*(...))

3.3 对com.slxy.dao包里面的所有的类,类里面所有方法进行增强
execution(* com.slxy.dao..(…))

  1. 进行配置的通知

1 在Spring配置文件中,开启注解扫描

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context  http://www.springframework.org/schema/beans/spring-context.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
"><!--  开启注解扫描  --><context:component-scan base-package="com.itheima.aopanno"></context:component-scan>
</beans>

2 使用注解创建User和UserProxy对象实例化

@Component    //注解创建类的对象实例化
public class UserProxy {public void before(){System.out.println("before....");}
}@Component
public class User {public void add(){System.out.println("add....");}
}

3 在增强类上面添加注解@Aspect

@Component
@Aspect
public class UserProxy {public void before(){System.out.println("before....");}
}

4 在Spring配置文件中开启生产代理对象

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
  1. 配置不同类型的通知

在增强类的里面,在通知方法上面添加通知类型注解,使用 切点表达式配置。

 //增强类
@Component("userproxy")
@Aspect
public class UserProxy {//前置通知@Before(value = "execution(* com.itheima.aopanno.User.add(..))")public void before(){System.out.println("before....");}//最终通知@After(value = "execution(* com.itheima.aopanno.User.add(..))")public void After(){System.out.println("After....");}//后置通知(返回通知)  有异常时不执行@AfterReturning(value = "execution(* com.itheima.aopanno.User.add(..))")public void AfterReturning(){System.out.println("AfterReturning....");}//异常通知@AfterThrowing(value = "execution(* com.itheima.aopanno.User.add(..))")public void afterThrowing(){System.out.println("afterThrowing....");}//环绕通知@Around(value = "execution(* com.itheima.aopanno.User.add(..))")public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {System.out.println("环绕之前....");//被增强方法执行proceedingJoinPoint.proceed();System.out.println("环绕之后....");}
}
  1. 相同的切入点抽取
   @Pointcut(value = "execution(* com.itheima.aopanno.User.add(..))")public void pointDemo(){}//前置通知@Before(value = "pointDemo()")public void before(){System.out.println("before....");}
  1. 有多个增强类对同一个方法进行增强,可以设置增强类的优先级。

在增强类上面添加注解@Order(数字类型值),数字类型值越小优先级越高。

//这里TeacherProxy类优先执行
@Component
@Order(1)
@Aspect
public class TeacherProxy {@Pointcut(value = "execution(* com.itheima.aopanno.User.add(..))")public void pointDemo(){}//前置通知@Before(value = "pointDemo()")public void before(){System.out.println("Teacher~~~before....");}
}@Component("userproxy")
@Order(2)
@Aspect
public class UserProxy {
  1. 完全使用注解开发

8.1 创建配置类,不需要创建xml配置文件

@Configuration
@ComponentScan(basePackages = {"com.itheima"})
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class ConfigAop {}

Spirng之AOP相关推荐

  1. 初级Java学习笔记总结

    java高并发解决方案:     1.页面静态:静态访问消耗的资源少             信息录入然后生成静态页面以供访问     2.数据库集群和库表散列             主-从数据库关 ...

  2. 在传统软件公司的悲惨经历

    IT公司可以分为互联网行业和传统行业,虽然在外行人看来都是搞 IT 的,但业内人士都知道,这其中的差别可谓是天差地远. 大多数人都和我一样处在传统行业,做着被大牛认为不是项目的项目. 2017年毕业, ...

  3. Spirng使用Aspectj实现AOP

    Aspectj实现AOP有两种方式: (1)基于aspectj的xml配置: (2)基于aspectj的注解方式: 一.基于aspectj的xml配置: 1.导入相关的AOP的jar包: 2.创建Sp ...

  4. AOP底层原理与注解配置详解

    注解开发AOP制作步骤: 在XML格式基础上 导入坐标(伴随spring-context坐标导入已经依赖导入完成 开启AOP注解支持 配置切面@Aspect 定义专用的切入点方法,并配置切入点@Poi ...

  5. Spring基础——AOP

    AOP术语 1.连接点:类里面可以被增强的方法 2.切入点:实际被增强的方法 3.通知(增强):实际增强的逻辑部分.通知类型有多种:前置通知@Before.后置通知@AfterReturning.环绕 ...

  6. SSH框架之Spring4专题3:Spring与AOP

    1 AOP的引入 1.1 Step1:项目aop_leadin1 先定义好接口与一个实现类,该实现类中除了要实现接口中的方法外,还要再写两个非业务方法,非业务方法也称之为交叉业务逻辑: doTrans ...

  7. 彻底学会Spring的IOC和AOP——理论+实操

    目录 1 IOC 1.1 概念 1.2 底层原理 1.3 IOC容器 1.4 Bean管理:基于xml配置文件实现 1.5 两种类型的Bean 1.6 Bean的作用域 1.7 Bean的生命周期 1 ...

  8. 005-搭建框架-实现AOP机制【二】AOP技术

    一.什么是AOP aspect-oriented  programming,面向切面编程,对oop的一种补充. 著名示例,aspectj,spring+aspectj 二.aop之代码重构 2.1.代 ...

  9. Spring框架-AOP

    1.什么是AOP? 面向切面编程,可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率 通过不修改源代码方式,在主干功能里面添加新功能 2 ...

最新文章

  1. 不追逐标准化产品,360数科的一站式风控体系有何不同?
  2. 计算发送延时与传播延迟_消息队列——延时消息应用解析及实践
  3. php get_extension_funcs,get_extension_funcs()
  4. HDR 成像技术学习(二)
  5. python变量分配内存_Python | 声明任何变量而不分配任何值
  6. mysql gtid 还是pxc_记一次 PXC 集群拆分引发的思考
  7. python 为什么动态语言_Python动态语言
  8. tornado实现基于websocket的好友一对一聊天功能
  9. android EditText获取光标位置并安插字符删除字符
  10. 一些常见的项目行为状态[转]
  11. 深度学习入门,Keras Conv2D类参数详解
  12. #Excel公式应用#从数据透视表进一步汇总文本信息
  13. 中国各省存贷款余额(2003-2020年)
  14. mysql virt虚拟内存_Java 进程占用VIRT虚拟内存超高的问题
  15. 不会编程,别着急!免编程工具助你快速开发App
  16. ur5+moveit 3D perception功能应用
  17. 计算机软件著作权的注册和认证
  18. 神经网络入门(连载之一)
  19. 计算机网络原理 计算题,计算机网络原理计算题
  20. c语言 10 9-8 7-6… 1循环语句,C语言学习与总结---第五章:循环结构程序设计

热门文章

  1. 【摄影与图像】光圈,对焦,变焦,补偿,直方图,以及白平衡的总结
  2. 家用计算机缺点,一体机的优点和缺点分别是哪些
  3. Leetcode刷题100天—524. 通过删除字母匹配到字典里最长单词(双指针)—day38
  4. Qt之实现图片或按钮等控件的倒影效果
  5. 2022-2027年中国无缝内衣行业市场调研及未来发展趋势预测报告
  6. 内衣蕾丝面料的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  7. desktop位置不可用,桌面文件丢失,重启无效
  8. 画图板软件的功能需求文档
  9. 高级屏蔽优酷广告(终极利器)
  10. CVE-2017-8295——WordPress未经授权密码重置漏洞