AOP学习笔记一
软件开发的目的是为了解决各种需求,包括业务需求和系统需求。目前,业界通过使用面向对象的编程思想,已经可以对业务需求等普通关注点进行很好的抽象与封装,并且使之模块化。但是对于系统需求一类的关注点来说,情况却有所不同。对于业务需求而言,需求与其具体实现之间的关系基本上是一对一的。我们可以在系统中的某一个确定的点找到针对需求的实现,无论是开发还是维护,都比较方便。但是系统需求,比如记录日志、事务管理等系统需求,它们往往在系统的各处散落。我们需要找到一种更好的方式来解决这类系统需求,这种软件开发模式就是面向切面编程,也就是AOP。
我们可以发现,任何一个软件系统,其中的日志记录、安全检查、事务管理等系统需求就像一把刀,横切到我们系统中各个业务功能模块之上。在AOP的行话中,这些系统需求是系统中的横切关注点。在AOP中,是使用Aspect的概念来对横切关注点进行封装。Aspect至于AOP,就相当于Class至于OOP。我们应该明白,AOP仅仅是OOP方法的一种补足,但我们把以Class形式模块化的业务需求和以Aspect形式模块化的系统需求拼接转到一起的时候,整个系统功能就完整了。

在对整个系统进行分析之后,我们可以将不同的需求实现为Aspect类型和Class类型的两种积木,他们拼装到一起才能组成一个功能完整的系统。但是两个积木空间并不是等同的,限于当前的技术,Aspect积木空间不能独立构建,AOP没有主权,现有的AOP实现都需要“寄生”于OOP的主权领土上。AOP作为一种概念,同样需要实现方式,AOP也需要某种语言帮助实现相应的概念实体,我们统称这些实现AOP的语言为AOL。AOL可以与系统实现语言一致,比如JAVA,也可以是自己的语言,比如AspectJ等。AOL实现的AOP各个概念实体,最终都要以某种模式集成到系统实现语言所实现的OOP实体组件中。把AOP组件集成到OOP组件的过程,在AOP中称之为织入过程。
AOP的发展进程可以简单地分成两代:第一代是静态AOP时代,相应的横切关注点以Aspect形式实现之后,通过特定编译器将Aspect编译并织入到系统的静态类中;第二代是动态AOP时代,通过使用Java语言提供的各种动态特性来实现Aspect织入到当前系统的过程。在Java平台上,AOP发展到今天,主要使用的AOP实现机制有:
+ 动态代理
+ 动态字节码增强
+ Java代码生成
+ 自定义类加载器
+ AOL扩展
可以看到这五种实现AOP的方式,其中有些已经过时,他们之间的优缺点可以根据本身的机制推导出来。 AOP作为一种编程思想的概念,其中包含有较多的细节概念,在深入学习AOP实现之前,我们必须先熟悉熟悉。
+ Joinpoint 可以进行织入的系统执行点
+ Pointcut Joinpoint的表达方式(直接指定方法名称、正则表达式、特定Pointcut表述语言)
+ Advice 单一横切关注点逻辑的载体,代表将会织入到Joinpoint的横切逻辑(Before Advice、After Advice(After returning、After throwing、After Finally)、Around Advice、Introduction
+ Aspect 对横切关注点逻辑进行模块化封装的AOP概念实体(可包含多个Pointcut以及相关Advice定义)
+ 织入和织入器 只有经过织入,以Aspect模块化的横切关注点才会集成到OOP现存系统中。(AspectJ使用专门编辑器ajc、JBoss AOP使用自定义类加载器、Spring AOP使用一组类,最常用ProxyFactory)
+ 目标对象 符合Pointcut所指条件,将被织入横切逻辑的对象
AOP是近年来流行起来的一种软件开发模式,本文都Java平台上的各种AOP框架及产品的实现原理和方式进行了简单地剖析,希望对理解AOP的现状有一个总体的认识。
AOP学习笔记一的更多相关文章
- Spring入门IOC和AOP学习笔记
Spring入门IOC和AOP学习笔记 概述 Spring框架的核心有两个: Spring容器作为超级大工厂,负责管理.创建所有的Java对象,这些Java对象被称为Bean. Spring容器管理容 ...
- Aop学习笔记
在学习编程这段时间我想大家都是习惯了面向过程或者面向对象的思想来编程,较少或者没有接触过面向方面编程的思想. 那么什么是面向方面(Aspect)——其实就是与核心业务处理逻辑无关的切面,例如记录日志. ...
- Spring AOP学习笔记01:AOP概述
1. AOP概述 软件开发一直在寻求更加高效.更易维护甚至更易扩展的方式.为了提高开发效率,我们对开发使用的语言进行抽象,走过了从汇编时代到现在各种高级语言繁盛之时期:为了便于维护和扩展,我们对某些相 ...
- Spring AOP学习笔记02:如何开启AOP
上文简要总结了一些AOP的基本概念,并在此基础上叙述了Spring AOP的基本原理,并且辅以一个简单例子帮助理解.从本文开始,我们要开始深入到源码层面来一探Spring AOP魔法的原理了. 要使用 ...
- Spring AOP学习笔记03:AOP的核心实现之获取增强器
上文讲了spring是如何开启AOP的,简单点说就是将AnnotationAwareAspectJAutoProxyCreator这个类注册到容器中,因为这个类最终实现了BeanPostProcess ...
- Spring AOP学习笔记05:AOP失效的罪因
前面的文章中我们介绍了Spring AOP的简单使用,并从源码的角度学习了其底层的实现原理,有了这些基础之后,本文来讨论一下Spring AOP失效的问题,这个问题可能我们在平时工作中或多或少也会碰到 ...
- AOP 学习笔记
代理是一个设计模式,提供了对目标对象另外的访问方式:即通过代理访问目标对象. 好处:可以在目标对象实现的基础上,增强额外的功能操作. Cglib 代理,也叫作 子类代理. JDK的动态代理有一个限制, ...
- AOP学习笔记二
Spring AOP采用Java作为AOP的实现语言(AOL),学习曲线平滑,Spring AOP对AspectJ也提供了很好的集成与支持.最为第二代的AOP,采用动态代理机制和字节码生产技术实现,在 ...
- Spring AOP学习笔记
Spring提供了一站式解决方案: 1) Spring Core spring的核心功能: IOC容器, 解决对象创建及依赖关系 2) Spring Web ...
随机推荐
- 发布自己的Angular2库初探
从去年年底开始使用ng2,遇到并解决或被虐了一些问题点,对其各种新特性与开发模式感觉还算舒服.还有的一个感想就是,要使用ng2还得先学习不少其他东西,比如TypeScript语法,比如ES6新特性,还 ...
- MYSQL创建用户Unknown column 'plugin' in 'mysql.user'的解决方法
执行下列sql ALTER TABLE `user` ADD `Create_tablespace_priv` ENUM('N','Y') NOT NULL DEFAULT 'N' AFTER `Tr ...
- 从C#到TypeScript - Proxy
总目录 从C#到TypeScript - 类型 从C#到TypeScript - 高级类型 从C#到TypeScript - 变量 从C#到TypeScript - 接口 从C#到TypeScript ...
- querySelectorAll与getElementsBy对比有什么不同
querySelectorAll与getElementsBy对比有什么不同javascript中的querySelectorAll与getElementsBy都可以获取dom元素对象,但是他们又有什么 ...
- 使用Spring构建RMI服务器和客户端
上一篇文章我们实用JDK原生API构造了简单RMI应用,本篇将实用Spring框架来构造RMI的应用,实用Spring你会体验到简单,不需要那么多的条条框框,因为Spring给你做了很多封装. 项目构 ...
- canvas作图
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- java构造函数使用方法总结
使用构造器时需要记住: 1.构造器必须与类同名(如果一个源文件中有多个类,那么构造器必须与公共类同名) 2.每个类可以有一个以上的构造器 3.构造器可以有0个.1个或1个以上的参数 4.构造器没有返回 ...
- 跨平台的.NET邮件协议MailKit组件解析
发起的.NET Core开源组织号召,进展的速度是我自己也没有想到的,很多园友都积极参与(虽然有些人诚心砸场子,要是以我以前的宝脾气,这会应该被我打住院了吧,不过幸好是少数,做一件事总有人说好,也有人 ...
- SSH登录与增删改查demo详解+源代码
点击下载,测试绝对可用SSH整合框架登录加增删改查demo 下载地址:http://download.csdn.net/detail/qq_33599520/9784679 一.框架概述 spri ...
- Omi v1.0震撼发布 - 令人窒息的Web组件化框架
原文链接--https://github.com/AlloyTeam/omi 写在前面 Omi框架经过几十个版本的迭代,越来越简便易用和强大. 经过周末的连续通宵加班加点,Omi v1.0版本终于问世 ...