1、SpringAOP,面向切面编程。在实际应用汇总很常见,一般用于日志、异常保存。也可以针对于相应的业务做处理

AOP核心概念

  1、横切关注点

  对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点

  2、切面(aspect)

  类是对物体特征的抽象,切面就是对横切关注点的抽象

  3、连接点(joinpoint)

  被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器

  4、切入点(pointcut)

  对连接点进行拦截的定义

  5、通知(advice)

  所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类

  6、目标对象

  代理的目标对象

  7、织入(weave)

  将切面应用到目标对象并导致代理对象创建的过程

  8、引入(introduction)

  在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段

2、切面的配置方式有两种:xml配置(建议)、注解

3、第一种方式:注解

  1)在相应的包里面建好自己类

  2)在相关的类上面加入相关注解,目的是认为这个类是切面

    

  3)进行相关切面的处理。这里存在两种方式,一种是直接类的方式,一种是用注解的方式

  这是第一种方式,是直接对应相关的类里面的方法做处理

package com.troy.ai.web.Interceptors;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component; @Aspect
@Component
public class AOPTEST {
@Pointcut("execution(* com.troy.ai.web.schedule.ScheduleController.*(..))")
public void test(){} @Before("test()") //也可以@Before("execution(* com.troy.ai.web.schedule.ScheduleController.*(..))")
public void before(JoinPoint joinPoint){
System.out.println(joinPoint.getSignature().getName()+"before");
} @After("test()")
public void after(JoinPoint joinPoint){
System.out.println(joinPoint.getSignature().getName()+"after");
}
}

  第二种:是通过注解的方式实现

  a、自己编写一个注解:

import java.lang.annotation.*;

@Target({ElementType.PARAMETER,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SystemLog {
String description() default "";
}

  b、再通过注解配置的方式来实现切面

@Aspect
@Component
public class LogInterceptor {
private long startTime;
private JSONObject json = new JSONObject();
@Pointcut("@annotation(com.troy.ai.web.Interceptors.SystemLog)")
public void logAspect(){}
@Before("logAspect()")
public void before(JoinPoint JoinPoint){} @AfterThrowing("logAspect()")
public void afterThrowing(){} @After("logAspect()")
public void after(JoinPoint JoinPoint){}

  这样只需要在要切面的类的方法上面加入这个注解就可以了

  

  这样这个方法,就可以通过自己的逻辑实现相关业务

  3)解释:JoinPoint 是对应切面所提供的接口,可以通过JoinPoint 来查找具体的信息

  

4、xml的配置方式,其实原理差不多

  1)还是写好对应的切面类(不需要做任何注解)

import org.aspectj.lang.JoinPoint;
public class AOPTEST { public void before(JoinPoint joinPoint){
System.out.println(joinPoint.getSignature().getName()+"before");
} public void after(JoinPoint joinPoint){
System.out.println(joinPoint.getSignature().getName()+"after");
}
}

  2)进行xml配置

<bean id="AOPTEST" class="com.troy.ai.web.Interceptors.AOPTEST"/>
<aop:config>
<aop:aspect id="aspect" ref="AOPTEST">
<aop:pointcut expression="execution(* com.troy.ai.web.schedule.ScheduleController.*(..))" id="pointcut"/>
<aop:before method="before" pointcut-ref="pointcut"/>
<aop:after method="after" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>

  3)这种方式也可以使用注解的方式来实现

5、区别

  1)共同点:在效果过实现上面都是一样的,并且两种方式在引用过程中都很容易理解

  2)不同点:

    a、注解的方式方便代码书写,并且很容易针对于新增的方法做处理,但是不好的地方在于,注解很容易分散,不易管理

    b、xml的方式再是集中管理,不管业务逻辑关系在正在怎么变化,所有东西都统一配置,便于管理。相对的在使用上面就没有那么舒服了,在新增方法上面或者个别上面,会存在多配置的情况

SpringAOP的两种实现方式的更多相关文章

  1. Spring-Aop的两种代理方式

    Spring-Aop两种代理方式: 1.JDK动态代理:用于目标类实现了接口: 2.Cglib动态代理:用于目标类没有实现接口: spring会依据目标类是否实现接口来选择使用哪种代理方式(目标类:相 ...

  2. Web APi之认证(Authentication)两种实现方式【二】(十三)

    前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底 ...

  3. Android中BroadcastReceiver的两种注册方式(静态和动态)详解

    今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...

  4. Android中Fragment与Activity之间的交互(两种实现方式)

    (未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如 ...

  5. JavaScript 函数的两种声明方式

    1.函数声明的方式 JavaScript声明函数有两种选择:函数声明法,表达式定义法. 函数声明法 function sum (num1 ,num2){ return num1+num2 } 表达式定 ...

  6. Redis两种持久化方式(RDB&AOF)

    爬虫和转载请注明原文地址;博客园蜗牛:http://www.cnblogs.com/tdws/p/5754706.html Redis所需内存 超过可用内存怎么办 Redis修改数据多线程并发—Red ...

  7. struts2+spring的两种整合方式

    也许有些人会因为学习了struts1,会以为struts2.struts1与spring的整合也是一样的,其实这两者相差甚远.下面就来讲解一下struts2与spring的整合两种方案.(部分转载,里 ...

  8. easyui datagride 两种查询方式

    easyui datagride 两种查询方式function doReseach() { //$('#tt').datagrid('load', { // FixedCompany: $('.c_s ...

  9. 【Visual Lisp】两种出错处理方式

    两种出错处理方式:一种是对出错函数进行重定义,一种是对错误进行捕捉处理. ;;============================================================= ...

随机推荐

  1. Github 下载项目的某一分支版本

    参考:如何在 GitHub 下载某个程序的特定版本(代码)? 在安装ntf做int实验的时候,发现int demo的这个repo是该项目的一个branch,与master分支不一致(5 commits ...

  2. .Net web 关于表单标题

    今天跟以前同事学到一个好东西,就是后台web界面表单标题展示的一个方法,新学到的一个方法...赶紧分享一下 在model 属性上加  [DisplayName("标题"), Req ...

  3. UVa 11825 黑客的攻击(状态压缩dp)

    https://vjudge.net/problem/UVA-11825 题意: 假设你是一个黑客,侵入了一个有着n台计算机(编号为0,1,...,n-1)的网络.一共有n种服务,每台计算机都运行着所 ...

  4. Binary Tree Zigzag Level Order Traversal,z字形遍历二叉树,得到每层访问的节点值。

    问题描述: Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from l ...

  5. 学习gulpfile.babel.js随笔

    'use strict' import gulp from 'gulp' //将gulp插件包含进来 import sass from 'gulp-sass' //编译sass文件 import im ...

  6. HTML深入探究(一)HTML入门

          HTML:超文本标记语言HyperText Markup Language,是一种用于创建网页的标准标记语言.HTML 不是一种编程语言,而是一种标记语言,标记语言是一套标记标签 (mar ...

  7. python开发_sqlite3_绝对完整_博主推荐

    '''SQLite数据库是一款非常小巧的嵌入式开源数据库软件,也就是说 没有独立的维护进程,所有的维护都来自于程序本身. 在python中,使用sqlite3创建数据库的连接,当我们指定的数据库文件不 ...

  8. Java网络编程和NIO详解3:IO模型与Java网络编程模型

    Java网络编程和NIO详解3:IO模型与Java网络编程模型 基本概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32 ...

  9. echart3 湖北地图及如何创建其他省份地图

    刚刚收到一封园友求助echart湖北地图的邮件,现在将湖北地图的所有代码贴到这里,希望可以帮助到更多朋友. 1.首先你得到echarts官网下载js,很多人说找不到,可以到我的git下载(https: ...

  10. java并发编程:线程安全管理类--原子操作类--AtomicIntegerFieldUpdater<T>

    1.类 AtomicIntegerFieldUpdater<T> public abstract class AtomicIntegerFieldUpdater<T> exte ...