spring AOP知识点总结以及日志的输出
AOP的作用就是在基于OCP在不改变原有系统核心业务代码的基础上动态添加一些扩展功能。通常应用于日志的处理,事务处理,权限处理,缓存处理等等
首先,使用AOP需要添加的依赖有:spring-context、aspectjrt(AOP的实现依托于Aspect框架,版本最好不要使用1.8.5)、aspectjweaver。
SpringAOP的配置有xml和注解两种。其中基于注解的配置又有两种方式:
一、直接在xml文件中
<!-- 在spring-configs.xml中配置对类组件的扫描 -->
<context:component-scan
base-package="com.spring"/>
<!-- 启用AOP注解(自动为目标对象创建代理对象) -->
<aop:aspectj-autoproxy/>
在测试方法中用ClassPathXmlApplicationContext初始化容器对象
二、类中基于注解配置、即全注解形式
@ComponentScan("com.spring.beans")
@EnableAspectJAutoProxy
public class AppConfig {
}
在测试方法中用AnnotationConfigApplicationContext初始化容器对象
几个概念:
①、切面 具体类,使用@Aspect注解声明
②、连接点:JoinPoint 被拦截的方法
③、切入点:pointcut 拦截的内容,多个连接点集合
④、通知:即执行的动作,切面上某个特定连接点上执行的操作
功能增强 通知五种类型@Before、@AfterReturning、@AfterThrowing、@After以及@Around
它们的执行顺序和try-catch-finally相仿:
@Before前置通知,是 目标对象的业务方法执行之前执行
@AterReturning后置通知,是目标对象的业务方法正常结束才会执行,目标方法抛出异常则不执行,相当于try中的return
@AfterThrowing异常通知,是发生异常执行 发生异常才会执行相当于catch
@After最终通知,是无论有没有异常都会执行 相当于finally
@Around是其他四个通知的综合。
需要注意的是,如果发生异常,顺序是 Before--After---AfterThrowing。发生异常,顺序是:Before--After---AterReturning
常用AOP切点表达式有:
bean:匹配指定bean id的方法执行 @Before("bean(orderServiceImpl)") 因为该类已交spring管理,所以默认类名的首字母小写就是该类的bean
within 匹配 某包名下的类中的所有方法 如:@Before("within(com.beans.impl.*)" ) 包名+类名,就像在xml文件中定义bean的时候需要写的class属性
execution:细粒度方式 @Before("execution(* com.beans.impl.*.*(..) )") 即:(返回值类型 包名.类名.方法名(参数列表))
区别:bean和within只能指定到类,不能指定具体方法,而execution可以指定到哪一个类中的具体哪一个方法,更加灵活。
其中使用的注解有:
接口的实现类用@Service注解
@Aspect标识其为一个AOP横切面对象
切入点@Ponitcut
@Order(数值),规定切面的执行顺序,如果是在xml配置,不依赖注解,在没有写order的情况下,两个切面如果对同一个方法,那么它的执行顺序跟配置文件中切面配置的先后顺序一致。
其中@Pointcut可以为通知的路径设置别名,代码入下:
@Pointcut("execution(* com.beans.impl.*.*(..))")
public void method(){}
@Before("method()")
 public void fun(){
   具体扩展的方法实体
}
AOP是如何为Bean对象创建代理对象的:cglib代理和jdk动态代理,概括的说,如果代理的是一个没有实现接口的目标对象,那么底层采用的是CGLIB代理,如果这个目标对象实现了某个接口那么底层就会采用JDK动态代理。其中CGLIB底层是代理对象继承了该目标对象,属于父子关系,而JDK动态代理的对象和目标对象实现同一个接口,类似兄弟关系。所以使用jdk代理的时候在getBean方法中,第二个参数 不能给一个实现类的.class,只能使用接口.class
输出日志
如果想要输出是哪个目标对象在调用哪个方法,可以使用JoinPoint作为日志输出,代码如下:
//权限管理
@Aspect
@Service
@Order(1)
public class permissionAspect{
private Logger logger = Logger.getLogger(Permission.Class.getName()); @Ponitcut("execution(* com.beans.impl.*.*(..))")
public void checkPermission(JoinPoint point) throws Throwable(){
//JointPoint是连接点对象,此对象中会封装目标对象以及目标方法相关信息,下面这句是:获取连接点所在类的名字
String clsName=point.getTarget().getClass().getName();
//getSignature()该方法是获取方法签名
String methodName=point.getSignature().getName(); //打印日志信息
logger.info("类名:"+clsName+“方法名:”+methodName+"权限监测")
}
}
spring AOP知识点总结以及日志的输出的更多相关文章
- Spring Boot 2.X(八):Spring AOP 实现简单的日志切面
		AOP 1.什么是 AOP ? AOP 的全称为 Aspect Oriented Programming,译为面向切面编程,是通过预编译方式和运行期动态代理实现核心业务逻辑之外的横切行为的统一维护的一 ... 
- Spring AOP 实现写事件日志功能
		什么是AOP?AOP使用场景?AOP相关概念?Spring AOP组件?如何使用Spring AOP?等等这些问题请参考博文:Spring AOP 实现原理 下面重点介绍如何写事件日志功能,把日志保存 ... 
- springboot—spring aop 实现系统操作日志记录存储到数据库
		原文:https://www.jianshu.com/p/d0bbdf1974bd 采用方案: 使用spring 的 aop 技术切到自定义注解上,针对不同注解标志进行参数解析,记录日志 缺点是要针对 ... 
- spring AOP自定义注解 实现日志管理
		今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ... 
- 利用Spring AOP自定义注解解决日志和签名校验
		转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ... 
- Spring AOP 切面实现操作日志
		创建接口注解日志类 package com.fh.service.logAop; /** * Created by caozengling on 2018/7/21. */ import java.l ... 
- (转)利用Spring AOP自定义注解解决日志和签名校验
		一.需解决的问题 部分API有签名参数(signature),Passport首先对签名进行校验,校验通过才会执行实现方法. 第一种实现方式(Origin):在需要签名校验的接口里写校验的代码,例如: ... 
- Spring AOP 知识点入门
		一.基本知识点 1.AOP概念 AOP(Aspect-Oriented Programming), 即 面向切面编程, 它与 OOP( Object-Oriented Programming, 面向对 ... 
- spring aop对service层日志和异常的处理
		1.aop是什么 AOP是Aspect Oriented Programming的缩写,意思是面向切面编程,与OOP(Object Oriented Programming)面向对象编程对等,都是一种 ... 
随机推荐
- 颠覆区块链的钱包——AngelToken钱包
			币圈的玩家/大佬们的刚需产品Angel token钱包您有吗? 当前由法国凡赛公司技术团队研发的去中心化AngelToken智能钱包,它兼容比特币底层技术系列币种,同时也兼容以太坊底层技术系列币 ... 
- 二进制转base64
			一. 以fetch的获取数据 1. response(后台返回): const buffer = response.arrayBuffer(),将二级制转成arrayBuffer类型 2. buffe ... 
- Unity协程实现伪加载页面
			先上效果图预览. ============================开始写实现方法================================ 1.我用的是UGUI,先在空场景中新建Slid ... 
- centos7搭建vsftpd并启用虚拟用户
			虚拟用户的特点是只能访问服务器为其提供的FTP服务,不能访问系统的其它资源,所以,如果想让用户对FTP服务器站内具有写权限,但又不允许访问系统其他资源,可以使用虚拟用户来提高系统的安全性. 在vsft ... 
- github同一账户+多个库
			目标 我的情况是,既要向自己的public库提交代码,又要向别人的private库提交代码 网上搜到的情况一:github上有多个账号,都要向自己的库提交代码 网上搜到的情况二:多个git托管源(比如 ... 
- 猪懂傻改之《powershell 代码规范》
			猪懂傻改之<powershell 代码规范> 脚本程序员或许都经历过这样的场景:接手别人的代码时,因为没有注释,变量名五花八门,模块之间逻辑关系如麻,弄得满头雾水,一脸茫然,痛定思痛之后不 ... 
- 根据要求写SQL 语句
			Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表  ... 
- 第4次作业 -- 基于Jenkins的持续集成
			Jenkins 配置使用心得 先在 https://jenkins.io/download/ 下载Jenkins 下载之后安装,在指定的地方找到了初始密码,安装了一些插件之后,Jenkins就可以使用 ... 
- L1-064 估值一亿的AI核心代码
			以上图片来自新浪微博. 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: 消除原文中多余空格:把相邻单词间的多个空格换成 1 个 ... 
- HTML网页音频控制
			// 音频播放function playSound(url) { var borswer = window.navigator.userAgent.toLowerCase(); var audio; ... 
