`
secondhrc
  • 浏览: 3649 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

基于js的简易aop框架

阅读更多

AOP参考资料:

来自百度   来自IBM

 

aop在spring中大量被使用到,说白了就是往目标代码中织入关注的切面代码,在spring中需要使用proxy或cglib中实现。

鉴于JavaScript的灵活性,在js中实现aop比想象中灵活得多。

 

下面写了个简单的实现,需要比较粗糙,pointcut什么的没有体验,但总体思想和aop一致。

 

 

1、

 

/*
			绑定的AOP
			*/
			bind:function(obj,advice){
				//如果已经绑定过了,就不再重复绑定了
				if(oldObjectFn[obj]!=null){
					return;
				}
				//生成织入器
				var inject=injectCreator(advice);
				dealObjectFunction(obj,inject);
			}

 aop绑定的入口在这里,这里根据传入的advice生成一个织入器。

 

 

2、

 

function dealObjectFunction(obj,inject){
			oldObjectFn[obj]={};
			
			for(var name in obj){
				
				if(obj.hasOwnProperty(name)){//原型链下的属性不操作
					var val=obj[name];
					if(isFunction(val)){//只操作function
						var oldfn=val;
						var newfn=inject(name,val,obj);//把切面代码织入到旧代码中
						obj[name]=newfn;
						oldObjectFn[obj][name]=oldfn;//旧方法保存起来
					}
				}
			}
		}

 筛选出目标函数,当然这里写的比较粗糙,只是简单把所有的方法的取出来(没得选)

 

 

var newfn=inject(name,val,obj)

 通过这个方法,编织出一个新的函数,保存旧函数,并替换目标函数。

 

 

3、 织入代码的具体实现

var injectCreator=function(advice){
			return function(name,oldfn,obj){	
					
				var before=advice.before||function(){},
				after=advice.after||function(){},
				afterReturn=advice.afterReturn||function(){},
				afterThrowing=advice.afterThrowing||function(){},
				around=advice.around||function(fn){
					var ret=fn();
					return ret;
				},
				
				fn=function(){

					var args=Array.prototype.slice.call(arguments);
					
					before.apply(obj,[name].concat(args)); //前置通知带上方法明
					
					var ret=around.call(obj,function(){
						try{
							return oldfn.apply(obj,args); //执行原有方法,并返回原方法的执行结果
						}catch(e){
							afterThrowing.call(obj,e);
							throw e;
						}
					});
					afterReturn.call(obj,ret);  
					after.call(obj);
					
					return ret;
				};
				
				return fn;
			}
		}

 

对advice进行简单修饰后,按先后顺序用before、around、afterReturn、after对旧方法进行装饰,放回新方法。

 

var args=Array.prototype.slice.call(arguments);

 因为arguments不是数组,为了让他居然数组的特性,进行上面的处理。

 

4、解绑

unbind:function(obj){
				var map=oldObjectFn[obj];
				if(map!=null){
					//把旧的方法放回去
					for(var key in map){
						var fn=map[key];
						obj[key]=fn;
					}
					oldObjectFn[obj]=null;
				}
				
			}

 

分享到:
评论

相关推荐

    基于SSH框架的简易博客系统

    **基于SSH框架的简易博客系统** SSH框架是Java Web开发中的一个经典组合,由Spring、Struts和Hibernate三个开源框架组成。本项目是利用这些框架在Eclipse集成开发环境中构建的一个简单博客系统,旨在提供一个基础的...

    基于SSM框架下,简易图片上传

    - **Spring**:Spring是Java企业级应用的核心框架,它提供了依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP),为应用程序提供了一个灵活的基础。 - **Spring MVC**:...

    简易java框架开源订销管理系统

    【简易Java框架开源订销管理系统】是一个基于Java技术构建的轻量级管理软件,它旨在为中小型企业提供一套高效、易用的订单销售管理解决方案。系统的核心特点是开源,这意味着源代码对公众开放,用户可以根据自身需求...

    java项目源码21期简易版基于SSM框架的图书管理系统.zip

    本项目是一个基于SSM框架(Spring、SpringMVC和MyBatis)的简易图书管理系统,主要面向学习者和初入IT行业的开发者,旨在提供一个实际的项目实践平台,帮助理解和掌握Java Web开发技术。通过该项目,你可以深入学习...

    基于SSH的简易选课系统(含数据库文件).zip

    SSH简易选课系统是一个典型的基于Java技术的Web应用程序,用于模拟大学中的在线选课流程。SSH是三个核心技术的缩写,分别是Spring、Struts和Hibernate,它们共同构建了一个强大的MVC(Model-View-Controller)架构。...

    简易java框架开源订销管理系统 v0.1

    《简易Java框架开源订销管理系统 v0.1》是一款基于Java技术开发的开源软件,旨在为中小型企业提供一套高效、易用的订单销售管理解决方案。系统以Java编程语言为核心,利用其跨平台特性,实现了一套功能完善的订销...

    基于ssm简易版营业厅宽带系统.zip

    《基于SSM简易版营业厅宽带系统》是一个典型的Java Web项目,主要采用了Spring、SpringMVC和MyBatis(简称SSM)三大框架构建。这个系统设计与实现旨在为营业厅提供一个简单易用的宽带业务办理平台,同时也适合作为...

    基于Spring框架+oracle实现简易论坛管理系统

    【标题】"基于Spring框架+Oracle实现简易论坛管理系统"是一个典型的Web应用开发案例,它结合了Java编程语言、Spring框架以及Oracle数据库系统,为初学者提供了构建基础论坛平台的实践指导。 【描述】中提到的功能...

    基于Spring+SpringMVC+MyBatis SSM框架的简易新闻系统前后台源码.rar

    这个简易新闻系统的源码就是基于这三种技术实现的,旨在提供一个简单的后台管理系统和前端展示页面,用于新闻发布和管理。下面将详细阐述这三大框架以及它们在新闻系统中的应用。 1. **Spring框架**:Spring是一个...

    基于SSM的一个小项目,基础项目,项目内容很丰富。适合刚入门的

    1. **Spring**:Spring 是一个开源的Java企业级应用框架,提供了IOC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)等功能,使得开发人员能够更专注于业务逻辑,而不是底层...

    java项目演示21期简易版基于SSM框架的图书管理系统.zip

    本项目是一个基于SSM(Spring、SpringMVC、MyBatis)框架的简易图书管理系统,主要面向初学者和需要进行毕业设计或课程设计的学员。SSM是Java Web开发中常用的三大框架,它们分别负责控制层、服务层和数据访问层的...

    ssm框架实现的员工管理系统

    这个"ssm框架实现的员工管理系统"是一个基于这些技术的项目,旨在帮助企业管理其员工信息,实现数据的增删查改功能。下面我们将详细探讨这个项目的相关知识点。 1. **Spring框架**:Spring作为核心容器,负责管理...

    简易搭建ssh 框架

    本篇文章将基于提供的压缩包文件,详细讲解如何简易搭建SSH框架,并介绍相关的库文件及其作用。 首先,SSH框架中的每一个组件都有其特定的功能: 1. **Spring**:这是一个全面的、开源的应用框架,提供了依赖注入...

    基于ssh的购物网站

    在"基于ssh的购物网站"项目中,源码会包含Struts2的Action类、Spring的配置文件、Hibernate的实体类和映射文件,以及相关的HTML、CSS、JavaScript文件。通过阅读和理解源码,可以深入学习SSH框架的实践应用,提升Web...

Global site tag (gtag.js) - Google Analytics