文档章节

了解Spring AOP

王大叔爱编程
 王大叔爱编程
发布于 2015/02/05 17:08
字数 1020
阅读 35
收藏 0

AOP

什么是AOP?

Aspect Oriented Programming 面向切面编程。

AOP常见的地方:最常见的就是我们很多框架当中用到的拦截器。

AOP的用途: 事务管理,安全检查,日志记录,缓存,对象池管理等。


AOP的基本概念

AOP从程序的运行角度考虑程序的流程,提取业务处理过程的切面,AOP面向的是程序运行过程中的各个步骤,希望以更好的方式来组合程序运行过程的各个步骤。

AOP框架并不与特定的业务代码耦合,AOP框架能够处理程序执行中的特定切入点(PointCut),而不与具体类耦合。

AOP框架的特点:

#1,各步骤之间良好的隔离性。

#2,源代码无关性。


下面是AOP中的常用术语:

#1, 切面(Aspect):业务流程运行的某个特定步骤,也就是应用运行过程的关注点,关注点可能横切多个对象,所以尝尝也

称为横切关注点。

#2,连接点(Joinpoint):程序执行过程中明确的点,如方法的调用,或者异常的抛出。Spring AOP中,连接点总是方法的调用。

#3,增强处理(Advice): AOP框架在特定的切入点执行的增强处理。处理有"around","before","after"等.

#4,   切入点(Pointcut): 可以插入增加处理的连接点。简而言之,当某个连接点满足指定要求时,该连接点将被添加增强处理,该连接点也就变成了切入点。

#5,引入:将方法或者字段添加到被处理的类中。Spring允许引入新的接口到任何被处理的对象。

#6,目标对象: 被AOP框架进行增强处理的对象,也被称为被增强的对象。如果AOP框架是通过运行时代理来实现的,那么这个对象将是一个被代理的对象。

#7, AOP代理:AOP框架创建的对象,简单的说,代理就是对目标对象的加强。Spring中的AOP代理可以是JDK的动态代理,也可以是CGLIB代理。前者为实现接口的目标对象的代理,后者为不实现接口的目标对象的代理。

#8, 织入(Weaving):将增强处理添加到目标对象中,并创建一个被增强的对象(AOP代理)的过程就是织入。织入有两种实现方式:编译时增强和运行时增强。Spring和其他纯Java AOP框架一样,在运行时完成织入。


Spring的AOP支持

Spring中的AOP代理由Spring的IOC容器负责生成,管理,其依赖关系也由IOC容器负责管理。因此,AOP代理可以直接使用容器中的其他Bean实例作为目标,这种关系可由IOC容器的依赖注入提供。Spring默认使用Java动态代理来创建AOP代理,这样就可以为任何接口实例创建代理了。

Spring也可以使用CGLIB代理,在需要代理类而不是代理接口的时候,Spring自动会切换为使用CGLIB代理。但Spring推荐使用面向接口变成,因此业务对象通常都会实现一个或多个接口,此时默认将使用JDK动态代理,但也可以强制使用CGLIB。


package com.wangbiao.aspect;

import java.sql.Date;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;


@Aspect
@Order(value=2)
public class LoginAspect {

    @Before("execution(* com.wangbiao.target.imp.*.*(..))")
    public void authority()
    {
        System.out.println("模拟执行权限检查");
    }
    
//    
//    @AfterReturning(returning ="rvt",pointcut="execution(* com.wangbiao.target.imp.*.*(..))")
//    public void log(String rvt)
//    {
//        System.out.println("记录log  " + rvt);
//    }
    
    @AfterReturning(pointcut="execution(* com.wangbiao.target.imp.*.*(..)) && args(name)")
    public void log2(String name)
    {
        System.out.println("记录log  " + name);
    }
    
    @AfterReturning(pointcut="execution(* com.wangbiao.target.imp.*.*(..)) && args(name,birthday)")
    public void log3(String name,Date birthday)
    {
        System.out.println("记录log  ");
    }
//    
//    @AfterThrowing(throwing ="exp",pointcut="execution(* com.wangbiao.target.imp.*.*(..))")
//    public void handleException(Throwable exp)
//    {
//        System.out.println("处理异常  " + exp.getCause()+"--"+exp.getMessage());
//    }
//    
////    @AfterThrowing(throwing ="exp",pointcut="execution(* com.wangbiao.target.imp.*.*(..))")
////    public void handleException(NullPointerException exp)
////    {
////        System.out.println("处理异常  " + exp.getCause()+"--"+exp.getMessage());
////    }
//    
//    @After("execution(* com.wangbiao.target.imp.*.*(..))")
//    public void handleExceptionII()
//    {
//        System.out.println("处理异常  ");
//    }
//    
//    @Around("execution(* com.wangbiao.target.imp.*.*(..))")
//    public void remark(ProceedingJoinPoint pj) throws Throwable
//    {
//        System.out.println("XXXXXXXXXXXX---before");
//        System.out.println(pj.getTarget()+"--"+pj.getSignature().getName()+"--"+pj.getArgs());
//        pj.proceed();
//        //pj.proceed(new Object[]{"hee"});
//        System.out.println("XXXXXXXXXXXX---after");
//    }
}



© 著作权归作者所有

共有 人打赏支持
王大叔爱编程

王大叔爱编程

粉丝 35
博文 113
码字总数 63525
作品 0
成都
程序员
那些年,我们一起追的Spring

学无止境,但仍需及时总结。 自去年开始写作以来,写了一些关于Spring的文章,今天将它们汇总起来,一方面方便大家阅读,另一方面,也是一次小的复盘总结。 IOC 首先是Spring的IOC,也就是控...

SexyCode
08/14
0
0
深入解析Spring架构与设计原理-AOP

关于AOP的个人理解 AOP联盟定义的AOP体系结构把与AOP相关的概念大致分为了由高到低、从使用到实现的三个层次。关于这个体系结构,个人的理解是这样的,从上往下,最高层是语言和开发环境,在...

Java小铺
08/27
0
0
Aspectj与Spring AOP比较

1、简介 今天有多个可用的 AOP 库, 它们需要能够回答许多问题: 是否与用户现有的或新的应用程序兼容? 在哪里可以实现 AOP? 与自己的应用程序集成多快? 性能开销是多少? 在本文中, 我们将...

沈渊
04/18
0
0
Spring实战 (四) AOP

在软件开发中,分布于应用多出的功能被称为和横切关注点. 通常,这些横切关注点从概念上是与应用的业务逻辑相分离的(但是往往直接嵌入到应用的业务逻辑中).将这些横切关注点与业务逻辑相分离正...

kenshiro
2013/09/15
0
0
Spring AOP 的实现方式(以日志管理为例)

Spring AOP 的实现方式(以日志管理为例) 2016年10月08日 00:13:57 阅读数:23198 在学习Spring框架的历程中,最重要的是要理解Spring的IOC和AOP了,不但要学会怎么用,最好是知道它是怎么实...

Jeam_
07/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

python:关于读取文件的指定行的问题

先来造一个文件:就叫做 test.txt吧,内容是下面这个样子: 表头1,数据12,数据23,数据34,数据45,数据56,数据67,数据7 那么我们并不打算把这个表头给读出来 怎么办呢? 先来打开文...

Oh_really
11分钟前
1
0
Rails 用现代 Rails 逃离单页面应用 “兔子洞”

在工作共总是觉得turbolinks非常爽,但是却总是被说成是过时的技术,大家都喜欢spa,哪怕不用的spa的人也是禁用掉的多,找不到很好的理由劝说别人使用,这篇文章说的很到位,或者说至少是牛人...

wmzsonic
16分钟前
0
0
Hive 分布式搭建,Spark集成Hive记录

本帖详细介绍搭建步骤,仅仅记录自己搭建过程以及采坑经历。 前提环境: Hadoop集群 版本2.7.2 Spark集群 版本2.1.0 Linux版本 Centos7 准备搭建 MySql版本5.5.61 ,Hive-2.1.0 去官网下载M...

我爱春天的毛毛雨
18分钟前
1
0
打包QML程序

1、windeployqt执行路径(D:\Qt\5.12.0\msvc2017_64\bin)加入到PATH中 2、使用Qt自带的命令行交互 Command 终端(Qt 5.12.0 64-bit for Desktop (MSVC 2017))切换到 Release 编译成功的exe...

渣渣曦
55分钟前
4
0
优秀互联网高级测试工程师应该具备的能力

概述 在之前写的互联网高级测试工程师至少具备的能力一文中,提到了测试工程师至少具备的能力,但是并没有提到优秀测试工程师应该具备的能力,下文简单的谈一谈。当然这些全部都是我的个人理...

Sam哥哥聊技术
59分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部