面向切面编程——Aop

一、概念

AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。它是一种新的方法论,它是对传统OOP编程的一种补充。

二、Aop原理

1.面向对象编程模型

OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。面向对象编程是关注将需求功能划分为不同的并且相对独立,封装良好的类,并让它们有着属于自己的行为,依靠继承和多态等来定义彼此的关系。面向对象编程着重于类的封装、对象的创建(生命周期)以及对象与对象之间的关系。

2.面向切面编程模型

Aop将应用系统分成两部分:核心业务逻辑和横向的通用逻辑,也就是所谓的方面。例如在面向对象编程中,除核心业务逻辑外还有涉及持久化管理、事物管理、安全管理、日志管理、调试管理等等。这样使用Aop就可以将处理方面的代码注入主程序,通常主程序的主要目的并不在于处理这些方面。

如果将面向对象看成编程模型的横向发展,那么面向切面编程模型是纵向发展,是面向对象的一个补充。

如图:

3.代理与容器

刚开始学习Aop感觉Aop很神奇,建立切面类(Aspect)、定义好切入点(Pointcut)、定义通知(Advice),发现这样就可以将切面类中的方法(Aop称为通知)随意的加到之前定义好的切入点上,即将特定的处理方面的代码注入到主程序中执行而不需要修改任何主程序代码。

如:

切面类:

package com.zhouxiang.log;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

/**
 * @author zx
 *
 */
@Aspect
@Component
public class Log {
    @Before("execution(public Boolean com.zhouxiang.service.LoginService.*(..))")
	public void loginLog()
	{
		System.out.println("start to login system!");
	}
    @After("execution(public Boolean com.zhouxiang.service.LoginService.*(..))")

    public void loginLogSuccess()
    {
    	System.out.println("end to login system!");
    }
}

目标对象:

package com.zhouxiang.service;
import sun.security.jca.GetInstance.Instance;
import com.zhouxiang.Dao.UserDao;

public class LoginService {
	private UserDao userdao;
	public UserDao getUserdao() {
		return userdao;
	}
	public void setUserdao(UserDao userdao) {
		this.userdao = userdao;
	}
	public Boolean UserInfoValidate(String username, String password)
	{

		System.out.println(userdao.toString());
	 if (userdao.Query(username)!=null)
		return true;
	 else
		return false;
	}
}

当定义好切面、通知后只需要再确定切入点后,连接点就可以将指定的方法在指定的类中调用。此处加到了service逻辑中,还可以加到Action中、Dao中,只需要改一下定义的连接点(Joinpint)、切入点(Pointcut)而不需要修改代码。这样的功能Aop是如何实现的呢?我们假设应用中存在方法拦截器这样的功能是不是就相对容易多了呢?我们只需要配置好方法拦截器,当程序执行到指定的方法时,方法拦截器就会对其进行拦截然后转而执行切面逻辑然后再继续执行主程序。所以弄清Aop只需要弄清方法拦截器即可。相信熟悉Struts2的同学对方法拦截器一定不陌生,在Aop中使用的方法拦截器跟struts2中的方法拦截器实现原理一样都是借助代理来实现对特定方法的拦截。

Aop原理就弄明白了,当我们声明切面类后,根据定义好的连接点或切入点就可以得到我们要将切面业务逻辑织入到何处即目标对象,这样我们可以对目标对象创建一个代理对象,代理对象调用目标对象之前调用切面逻辑然后再调用目标对象中的业务逻辑即是整个Aop的流程。

整个流程不可缺少的就是容器,容器帮我们创建代理对象,将应该注入的目标对象偷偷换成代理对象注入到指定的组件中,保证完成整个过程的调用。

三、Aop与面向对象

OOP是关注将需求功能划分为不同的并且相对独立,封装良好的类,并让它们有着属于自己的行为,依靠继承和多态等来定义彼此的关系;AOP是希望能够将通用需求功能从不相关的类当中分离出来,能够使得很多类共享一个行为,一旦发生变化,不必修改很多类,而只需要修改这个行为即可。

  AOP是使用切面(aspect)将横切关注点模块化,OOP是使用类将状态和行为模块化。在OOP的世界中,程序都是通过类和接口组织的,使用它们实现程序的核心业务逻辑是十分合适。但是对于实现横切关注点(跨越应用程序多个模块的功能需求)则十分吃力,比如日志记录,验证。面向切面编程,把散落在程序中的公共部分提取出来,做成切面类,这样的好处在于,代码的可重用,一旦涉及到该功能的需求发生变化,只要修改该代码就行,否则,你要到处修改。

四、总结

面向方面编程和面向对象编程不但不是互相竞争的技术而且彼此还是很好的互补。面向对象编程主要用于为同一对象层次的公用行为建模。它的弱点是将公共行为应用于多个无关对象模型之间。而这恰恰是面向方面编程适合的地方。有了 AOP,我们可以定义交叉的关系,并将这些关系应用于跨模块的、彼此不同的对象模型。AOP 同时还可以让我们层次化功能性而不是嵌入功能性,从而使得代码有更好的可读性和易于维护。

 

面向切面编程——Aop,布布扣,bubuko.com

时间: 2024-10-25 10:41:38

面向切面编程——Aop的相关文章

Web项目中静态代理和动态代理为基础的面向切面编程AOP

本来每天更新的,我一般喜欢夜里过了十二点的时候发文章,结果难道是愚人节吗?学校的网也很有意思,断了,把我给耍了...好吧-开始今天的话题AOP.AOP太重要了,所以放到第二篇文章来谈这个话题,AOP是Spring中的重要概念.如果这个不理解Web开发中的三大框架的原理,那就呵呵了.时常听到同学和网友议论Web程序员大部分时间都是在考皮XML配置,我当时听到也是醉了,所以我要用心学习Web,其实这里面蕴含的设计模式.算法.架构思想在源码中体现的淋漓尽致啊,一个大宝库竟然视而不见可惜了.下面就一起品

Spring(四):面向切面编程AOP

横切关注点:分布于应用中多处的功能 面向切面编程AOP:将横切关注点与业务逻辑相分离 在使用面向切面编程时,仍在一个地方定义通用功能,但是可以通过声明的方式定义这个功能以何种方式在何处应用,而无需修改受影响的类. 横切关注点可以被模块化为特殊的类,这些类被称为切面. 好处: 每个关注点集中于一处,而不是分散到多处代码中 服务模块更加简洁,因为它们只包含主要关注点的代码,次要关注点被转移到切面中了 1.定义AOP术语 1.1.通知(Advice) 切面的工作被称为通知. 通知定义了切面是什么以及何

面向切面编程aop

面向切面编程 (AOP) Aspect Oriented Programming 可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术.AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,提高代码的灵活性和可扩展性,AOP可以说也是这种目标的一种实现. 主要功能 日志记录,性能统计,安全控制,事务处理,异常处理等等 主要意图 将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的

spring中面向切面编程(AOP)的个人理解

面向切面编程AOP,是spring的一大特点 Aspect切面:封装共性功能的(增强功能的)类 Advice通过:切面类中封装的增强功能的方法. PointCut:切入点,是一个集合的概念,该集合的表达使用一个正则表达式表达 所有核心业务对象的所有方法的前后(事务处理AOP典型的应用) JoinPoint:连接点,程序中需要加入advice的地方,而且正在执行的ponitCut 织入(Weaving):将aspect和核心业务对象,进行整合的过程. 通过特定接口实现AOp Aop通知的类型: B

【串线篇】面向切面编程AOP

面向切面编程AOP 描述:将某段代码“动态”的切入到“指定方法”的“指定位置”进行运行的一种编程方式 (其底层就是Java的动态代理)spring对其做了简化书写 场景: 1).AOP加日志保存到数据库 2).AOP做权限验证,filter能做的它都能 3).AOP做安全检查 4).AOP做事务控制 AOP专业术语: 原文地址:https://www.cnblogs.com/yanl55555/p/11744089.html

Spring面向切面编程(AOP)

1 spring容器中bean特性 Spring容器的javabean对象默认是单例的. 通过在xml文件中,配置可以使用某些对象为多列. Spring容器中的javabean对象默认是立即加载(立即实例化:spring加载完成,立即创建对象) scope:属性 singleton:默认值为单例,默认也是立即加载,在加载完成spring容器的时候,bean对象已经创建完成 prototype:多例的,默认懒加载,spring容器加载完成的时候,不会创建bean的对象,只有从容器获得bean对象的

Spring之面向切面编程AOP(二)

简介 当积累的知识点到一定量的时候,学新知识就变得容易多了.希望再接下来的学习顺利进行下去.今天知识也是挺简单的,主要就是AOP面向切面编程.其中牵涉到了JDKProxy和CGLIB两个代理类,如何使用好,加以深刻理解.学起Spring切面编程也就简单多了 代理模式 1. 代理模式介绍 代理模式的英文叫做Proxy或Surrogate,中文都可译为"代理",所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对

面向切面编程AOP之动态代理

动态代理的作用是:最终是为了学习AOP(面向切面编程):    拓展一下:OOP是什么?  OOP是面向对象编程!! 面向切面--->与装饰者模式有点相似 --->比装饰者模式还要灵活 学习动态代理,我们只需要学习一下一个类即可 Proxy类,并对该类下的一个静态方法newProxyInstance()进行学习 直接上代码:

转:面向切面编程AOP的理解

AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入封装.继承.多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合.不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能.日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性.异常处理和透明的持续性也都是如此,这种散布在各