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知识点总结以及日志的输出的更多相关文章

  1. Spring Boot 2.X(八):Spring AOP 实现简单的日志切面

    AOP 1.什么是 AOP ? AOP 的全称为 Aspect Oriented Programming,译为面向切面编程,是通过预编译方式和运行期动态代理实现核心业务逻辑之外的横切行为的统一维护的一 ...

  2. Spring AOP 实现写事件日志功能

    什么是AOP?AOP使用场景?AOP相关概念?Spring AOP组件?如何使用Spring AOP?等等这些问题请参考博文:Spring AOP 实现原理 下面重点介绍如何写事件日志功能,把日志保存 ...

  3. springboot—spring aop 实现系统操作日志记录存储到数据库

    原文:https://www.jianshu.com/p/d0bbdf1974bd 采用方案: 使用spring 的 aop 技术切到自定义注解上,针对不同注解标志进行参数解析,记录日志 缺点是要针对 ...

  4. spring AOP自定义注解 实现日志管理

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...

  5. 利用Spring AOP自定义注解解决日志和签名校验

    转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...

  6. Spring AOP 切面实现操作日志

    创建接口注解日志类 package com.fh.service.logAop; /** * Created by caozengling on 2018/7/21. */ import java.l ...

  7. (转)利用Spring AOP自定义注解解决日志和签名校验

    一.需解决的问题 部分API有签名参数(signature),Passport首先对签名进行校验,校验通过才会执行实现方法. 第一种实现方式(Origin):在需要签名校验的接口里写校验的代码,例如: ...

  8. Spring AOP 知识点入门

    一.基本知识点 1.AOP概念 AOP(Aspect-Oriented Programming), 即 面向切面编程, 它与 OOP( Object-Oriented Programming, 面向对 ...

  9. spring aop对service层日志和异常的处理

    1.aop是什么 AOP是Aspect Oriented Programming的缩写,意思是面向切面编程,与OOP(Object Oriented Programming)面向对象编程对等,都是一种 ...

随机推荐

  1. AS添加依赖报错Unable to merge dex

    AS添加依赖报错Unable to merge dex 最近在给项目添加依赖的时候,要给项目导入Bmob的SDK,参照Bmob的官方文档,可以直接在app的build.gradle文件中添加 //Bm ...

  2. mysql数据库的基本操作命令总结

    本文章将讲述Mysql数据的的基本操作.前期的安装请自行百度 运行环境:linux Ubuntu 16.04 命令行连接 在工作中主要使用命令操作方式,要求熟练编写 打开终端,运行命令 mysql - ...

  3. python模块part1

    一.时间模块 1.时间表示形式 在Python中,通常有这三种方式来表示时间:时间戳.元组(struct_time).格式化的时间字符串:(1)时间戳(timestamp) :通常来说,时间戳表示的是 ...

  4. 语法、id和class选择器、创建、

    一. 1.CSS规则由两个主要部分构成:选择器,以及一条或多条声明(每条声明由一个属性和一个值构成,属性和值被冒号分开). 2.声明以分号“:”结束,生命组用大括号“{}”括起来. [示例:p {co ...

  5. [转] How Bill Gates read books

    Bill Gates is one of the most famous figures in the business world. He is one of the richest men in ...

  6. canvas初体验

    利用画布,绘制随机大小,颜色,位置 方框<!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  7. jQuery 入口函数主要有4种写法

    jqery  入口函数主要有4种写法,其中以第3种方法最为方便. <!DOCTYPE html> <html lang="en"> <head> ...

  8. chrome恢复默认搜索引擎为Google

    管理员身份运行cmd RD /S /Q "%WinDir%\System32\GroupPolicyUsers" RD /S /Q "%WinDir%\System32\ ...

  9. vue-resource 和 axios的区别

    vue-resource Vue.js是数据驱动的,这使得我们并不需要直接操作DOM,如果我们不需要使用jQuery的DOM选择器,就没有必要引入jQuery.vue-resource是Vue.js的 ...

  10. pytest自动化2:测试用例setup和teardown

    前言: pytest支持函数和类两种用例方式,针对每种情况都有不同的代码 pytest用例运行级别 模块级(setup_module/teardown_module)开始于模块始末,全局的 函数级(s ...