spring-2-AOP
AOP(面向切面编程)
面向切面编程, 即利用AOP可以对业务逻辑的各个部分进行隔离, 从而使得业务逻辑各个部分之间的耦合度降低, 提高程序的可重用性, 同时提高了开发的效率.
不通过修改源代码,通过加上一个模块就在原有代码的功能上增加一个新功能
底层原理
AOP通过代理对象的方式来增强其他的类的功能, 从而避免修改源代码, 根据待增强类有无实现接口, 可以将代理对象分为两类:
- 有接口情况, 使用JDK动态代理: 即创建原来接口实现类的代理对象, 用此对象去增强待增强类;即为动态代理
- 无接口情况, 使用CGLIB动态代理: 创建当前类的子类的代理对象, 用此对象去增强;
AOP术语
1. 连接点
类中可以被增强的方法被称为连接点
2. 切入点
类中实际被增强的方法成为切入点
3.通知(增强)
实际增强的逻辑部分称为通知(增强)
通知(增强)有多种类型:
- 前置通知: 在切入点之前执行的通知
- 后置通知: 在切入点之后执行的通知
- 环绕通知: 在切入点前后都执行的通知
- 异常通知: 在切入点发生异常时执行的通知
- 最终通知: 相当于Java中的finally, 即无论发生异常都执行的通知
4. 切面
切面就是指把通知应用到切入点的过程
AOP操作(准备)
什么是aspectj?
aspectj不是Spring组成部分,是一个独立的AOP框架,一般把aspectj和spring框架一起使用,进行AOP操作
基于sapectj实现AOP操作的两种方式:
基于xml配置文件实现
基于注解方式实现(现在使用)
切入点表达式
作用: 知道对哪个类里面的哪个方法进行增强
语法结构: execution([权限修饰符] [返回类型] [类全路径] 方法名称)
举例说明:
例1. 对com.ryan.class 类里面的 add 方法进行增强:
execution(* com.ryan.class.add(..))
说明: 权限修饰符可以省略,*表示任意放回值, (..)表示所有参数
例2. 对com.ryan.class 类里面的所有方法进行增强:
execution(* com.ryan.class.*(..))
例3. 对com.ryan 包里面的所有类中的所有方法进行增强:
execution(* com.ryan..(..))
AOP操作(AspectJ注解)
流程了解
(1)创建被增强类和增强代理类
(2)在spring配置文件中,开启注解扫描
(3)使用注解创建User和UserProxy
(4)在增强代理类上添加注解@Aspect
(5)在spring配置文件中开启生成代理对象
创建被增强类,并添加注解
package com.wang.AOPanno;
@component
public class User {
public void add(){
System.out.println("add____________________");
}
}
创建增强类,并添加注解
package com.wang.AOPanno;
@Component
@Aspect
public class UserProxy {
@Before(value = "execution(* com.wang.AOPanno.User.add(..))")
public void before(){
System.out.println("before");
}
}
开启扫描,并在spring配置文件中开启生成代理对象
<!--开启扫描-->
<context:component-scan base-package="com.wang.AOPanno"></context:component-scan>
<!--开启代理生成-->
<aop:aspectj-autoproxy ></aop:aspectj-autoproxy>
测试
@org.junit.Test
public void test1(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
User user = context.getBean("user", User.class);
//调用方法,出现了前置方法则为成功
user.add();
}
了解各种方法的执行关系

其他注解拓展操作
抽取相同切入点(@Pointcut注解)
@Component
@Aspect
public class UserProxy {
@Pointcut(value = "execution(* com.wang.AOPanno.User.add(..))")
public void pointdemo(){};
@Before(value = "pointdemo()")
public void before(){
System.out.println("before");
}
}
多个代理类对同一个类增强时的优先级(@order(数字))
数字越小优先级越高
@Component
@Aspect
@Order(1)
public class UserProxy {...}
@Component
@Aspect
@Order(3)
public class PersonProxy {...}
spring-2-AOP的更多相关文章
- Spring基于AOP的事务管理
Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...
- Spring实现AOP的4种方式
了解AOP的相关术语:1.通知(Advice):通知定义了切面是什么以及何时使用.描述了切面要完成的工作和何时需要执行这个工作.2.连接点(Joinpoint):程序能够应用通知的一个“时机”,这些“ ...
- spring的AOP
最近公司项目中需要添加一个日志记录功能,就是可以清楚的看到谁在什么时间做了什么事情,因为项目已经运行很长时间,这个最初没有开来进来,所以就用spring的面向切面编程来实现这个功能.在做的时候对spr ...
- Spring(五)AOP简述
一.AOP简述 AOP全称是:aspect-oriented programming,它是面向切面编号的思想核心, AOP和OOP既面向对象的编程语言,不相冲突,它们是两个相辅相成的设计模式型 AOP ...
- Spring中AOP原理,源码学习笔记
一.AOP(面向切面编程):通过预编译和运行期动态代理的方式在不改变代码的情况下给程序动态的添加一些功能.利用AOP可以对应用程序的各个部分进行隔离,在Spring中AOP主要用来分离业务逻辑和系统级 ...
- Spring之AOP面向切片
一.理论基础: AOP(Aspectoriented programming)面向切片/服务的编程,在Spring中使用最多的是对事物的处理.而AOP这种思想在程序中很多地方可以使用的,比如说, ...
- 利用CGLib实现动态代理实现Spring的AOP
当我们用Proxy 实现Spring的AOP的时候, 我们的代理类必须实现了委托类的接口才能实现. 而如果代理类没有实现委托类的接口怎么办? 那么我们就可以通过CGLib来实现 package cn. ...
- spring之aop概念和配置
面向切面的一些概念: 简单说: 连接点就一些方法,在这些方法基础上需要额外的一些业务需求处理. 切入点就是方法所代表的功能点组合起来的功能需求. 通知就是那些额外的操作. 织入就是使用代理实现整个切入 ...
- Spring的AOP与代理
spring 支持两种注入方式: setter/constructor 支持多种配置方式: xml/java5注解/java类配置 支持两种事务管理: 声明性/编程性 实际上上述方式只有一个就能保证系 ...
- Spring 实践 -AOP
Spring 实践 标签: Java与设计模式 AOP引介 AOP(Aspect Oriented Programing)面向切面编程采用横向抽取机制,以取代传统的纵向继承体系的重复性代码(如性能监控 ...
随机推荐
- 系统芯片(SOC)架构- Aviral Mittal
系统芯片(SOC)架构- Aviral Mittal System on Chip Architecture-Aviral Mittal 此技术是在设计片上系统时考虑体系结构级别的因素.同样,范围是围 ...
- Docker基本概念介绍
前言 Docker和Kubernetes是我最近在学习的内容,本来是去年的目标,由于工作比较忙,没有时间去学习,今年剩下的半年时间我会好好系统学习下相关的内容,最后在学习下Devops相关理念,希望最 ...
- NX二次开发-将3X3矩阵修正为正交且长度为单位长度的矩阵
函数:UF_MTX3_ortho_normalize() 函数说明:将矩阵修正为正交且xyz长度为单位长度的矩阵.下图中输入的矩阵为三条线段的端点,经过修正后,生成一个坐标系. 1 #include ...
- python10-网络编程
1,七层网络协议 应表会传网数物: 应用层.表示层.会话层 (这三层又可以合并为应用层,这样就是五层网络协议[osi五层协议]) python '你好'.encoding('utf-8') 传输层. ...
- 干货 | LuatOS BSP移植教程,简单到复制粘贴!!!
LuatOS本着自身的开源特性,可以很轻松的嵌入到很多微处理器和微控制器.今天简要讲下如何移植这套系统,上手比较简单,看完基本就会了. 要想做移植,就要先了解需要移植芯片的SDK,LuatOS依赖于F ...
- gRPC入门—golang实现
1.RPC 1.1 什么是RPC RPC(Remote Procedure Call),即远程过程调用,过程就是方法,简单来说,它就是一种能够像调用本地方法一样调用远程计算机进程中的方法的技术,在这种 ...
- c#json将字符串反序列化成对象时不新建类的做法
在服务端代码文件中加上struct结构体就能解决 struct LocationInfo { public string LocationID { get; set; } public string ...
- Vsftpd虚拟用户登陆配置(Centos7)
1 安装Vsftpd服务 # yum install vsftpd -y vsftp虚拟用户是为了保证FTP服务器的安全性,由vsftpd服务器提供的非系统用户账号, 相对于FTP的本地用户来说,虚拟 ...
- 7.7、深入解析openstak工作流程
1.openstack的使用: (1)使用openstack创建的用户默认是default域,角色是user; (2)域-->角色-->用户-->项目 (3)配额在管理员登录后再项目 ...
- python3 依赖倒置原则示例
场景 针对园区停车信息,需要对各个公司提供的停车数据进行整合并录入自家公司的大数据平台 数据的录入无外乎就是对数据的增删改查 下面上一个常规的写法(未符合依赖倒置),整合来自 长安和丰田 的停车数据 ...