`

JAVA AOP

 
阅读更多

AOP背景

 

Dijkstra--separation of concerns(分散关注)

所谓的分离关注就是将某一通用的需求功能从不相关的类之中分离出来;同时,能够使得很多类共享一个行为,一旦行为发生变化,不必修改很多类,只要修改这个行为就可以。

设计模式孜孜不倦追求的是调用者和被调用者之间的解耦。

OOP-面向对象编程

针对问题领域中以及业务处理过程中存在的实体及其属性和操作进行抽象和封装。

面向对象的核心概念是纵向结构的,其目的是获得更加清晰高效的逻辑单元划分。

 

 

AOP:Aspect oriented programming. AOP实际是设计模式的一种扩展,提供从另一个角度来考虑程序结构以完善面向对象编程(OOP)。

面向对象将应用程序分解成各个层次的对象。

而AOP将程序分解成各个方面或者说关注点这使得可以模块化诸如事务管理等这些横切多个对象的关注点。(这些关注点术语称作横切关注点。)

AOP的核心思想就是将应用程序中的业务逻辑处理部分同对其提供支持的通用服务,即所谓的“横切关注点”进行分离,这些“横切关注点”贯穿了程序中的多个纵向模块的需求。

事务

安全

日志……

 

 

 

AOP是一个概念,并没有设定具体语言的实现,它能克服那些只有单继承特性语言的缺点(如Java),目前AOP具体实现有以下几个项目:

AspectJ (TM):创建于Xerox PARC. 有近十年历史,成熟。缺点:过于复杂;破坏封装;需要专门的Java编译器。

动态AOP:使用JDK的动态代理API或字节码Bytecode处理技术。

 

 

AOP目的


 



 

应用切面


 

 

基于JAVA动态代理的AOP实现原理

 

 

public class AOPHandler implements InvocationHandler {
	private List interceptors = null;
	private Object objOriginal;
	
	public Object bind(Object objOriginal) {
		this.objOriginal = objOriginal;
                //返回动态代理实例
		return Proxy.newProxyInstance(objOriginal.getClass().getClassLoader(), objOriginal.getClass().getInterfaces(), this);
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object result = null;
		Throwable ex = null;
		InvocationInfo invInfo = new InvocationInfo(proxy, method, args, objOriginal, ex);
                //预执行
		invokeInterceptorsBefore(invInfo);	
		try {
			result = method.invoke(objOriginal, args);
			invInfo.setResult(result);
                        //后执行
			invokeInterceptorsAfter(invInfo);
		} catch (Exception e) {
			invInfo.setException(e);
                        //异常执行
			invokeInterceptorsException(invInfo);
		}
		return result;
	}
	//加载Interceptor
	private synchronized List getInterceptors() {
		if(interceptors == null) {
			interceptors = new ArrayList();
			Properties p = new Properties();
			ClassLoader loader = AOPHandler.class.getClassLoader();
			try {
				p.load(loader.getResourceAsStream("interceptor.properties"));
				String interceptorName = p.getProperty("interceptorName");
				Class cl = Class.forName(interceptorName);
				interceptors.add(cl.getConstructor(new Class[]{}).newInstance(new Object[]{}));
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return interceptors;
	}

	private void invokeInterceptorsBefore(InvocationInfo invInfo) {
		interceptors = getInterceptors();
		int len = interceptors.size();
		for(int i=0; i<len; i++) {
			((MyInterceptor) interceptors.get(i)).before(invInfo);
		}
	}
	
	private void invokeInterceptorsAfter(InvocationInfo invInfo) {
		interceptors = getInterceptors();
		int len = interceptors.size();
		for(int i=0; i<len; i++) {
			((MyInterceptor) interceptors.get(i)).after(invInfo);
		}
	}
	
	private void invokeInterceptorsException(InvocationInfo invInfo) {
		interceptors = getInterceptors();
		int len = interceptors.size();
		for(int i=0; i<len; i++) {
			((MyInterceptor) interceptors.get(i)).exceptionThrow(invInfo);
		}
	}
}

 

 

 

interceptor.properties配置文件:

InterceptorName=com.ht.MyInterceptor

 

 

拦截信息基本类

 

public class InvocationInfo {
	private Object proxy;
	private Method method;
	private Object[] args;
	private Object result;
	private Throwable exception;
	
	public InvocationInfo(Object proxy, Method method, Object[] args, Object result, Throwable exception) {
		this.proxy = proxy;
		this.method = method;
		this.args = args;
		this.result = result;
		this.exception = exception;
	}
	
	public Object getProxy() {
		return proxy;
	}
	public void setProxy(Object proxy) {
		this.proxy = proxy;
	}
	public Method getMethod() {
		return method;
	}
	public void setMethod(Method method) {
		this.method = method;
	}
	public Object[] getArgs() {
		return args;
	}
	public void setArgs(Object[] args) {
		this.args = args;
	}
	public Object getResult() {
		return result;
	}
	public void setResult(Object result) {
		this.result = result;
	}
	public Throwable getException() {
		return exception;
	}
	public void setException(Throwable exception) {
		this.exception = exception;
	}
}

 

 

自定义拦截器接口

public interface Interceptor {
	public void before(InvocationInfo invInfo);
	public void after(InvocationInfo invInfo);
	public void exceptionThrow(InvocationInfo invInfo);
}

 

具体拦截器实现

public class MyInterceptor implements Interceptor {

	@Override
	public void before(InvocationInfo invInfo) {
		System.out.println("pre processing...");
	}

	@Override
	public void after(InvocationInfo invInfo) {
		System.out.println("post processing...");
	}

	@Override
	public void exceptionThrow(InvocationInfo invInfo) {
		System.out.println("exception processing...");
	}
}

 

AOP 工厂类建立

public class AOPFactory {
	public static Object getProxyInstance(String clName) {
		AOPHandler handler = new AOPHandler();
		Class c;
		Object proxy = null;
		try {
			c = Class.forName(clName);
			proxy = handler.bind(c.newInstance());
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return proxy;
	}
}

执行

HelloWorld proxy = (HelloWorld) AOPFactory.getProxyInstance("com.ht.HelloWorldImpl");
proxy.sayHello();

 

注:实例proxy与HelloWorldImpl 均实现了统一的HelloWorld接口定义方法,通过建立代理可以方便地将日志,安全等事务进行委托。

 

  • 大小: 102.8 KB
  • 大小: 29.9 KB
  • 大小: 22.3 KB
0
0
分享到:
评论
4 楼 fojut 2014-07-10  
xiaokang1582830 写道
分析得不错....

good
3 楼 fojut 2014-07-10  
testing
2 楼 lz958942 2014-07-10  
这个不错。
1 楼 xiaokang1582830 2014-07-10  
分析得不错....

相关推荐

    java aop、ioc 、注解 实例 Demo

    Java AOP(面向切面编程)、IOC(控制反转)和注解是Java开发中的核心概念,尤其在Spring框架中被广泛应用。本实例Demo将深入探讨这三个主题,通过具体代码示例帮助理解它们的工作原理和实际用途。 AOP,即面向切面...

    aop.zip_884AOP_java aop原理_javaaop原理

    Java AOP(面向切面编程)是软件设计中的一个重要概念,它允许程序员定义“切面”,这些切面封装了特定的、与业务逻辑不直接相关的关注点,如日志、事务管理、性能监控等。AOP的核心思想是将横切关注点从核心业务...

    Aop.rar_aop_java aop 例 proxy

    在Java编程领域,AOP(Aspect Oriented Programming,面向切面编程)是一种强大的设计模式,它允许程序员将关注点从核心业务逻辑中分离出来,如日志、事务管理、性能监控等。AOP的主要思想是将这些横切关注点与主...

    Java实现aop案例

    Java AOP(面向切面编程)是一种编程范式,它允许程序员定义“切面”,这些切面封装了特定关注点的代码,如日志、事务管理、权限检查等。这样可以将这些关注点与核心业务逻辑分离,提高代码的可读性和可维护性。在...

    spring-aop.rar_java aop_spring aop

    【标题】"spring-aop.rar_java aop_spring aop" 涉及的主要知识点是Spring框架中的面向切面编程(AOP)以及Java基础知识。这个压缩包可能包含了一个简单的Spring AOP应用示例,同时也涵盖了Java的一些核心概念,如...

    AOP.rar_java aop_oracle

    Java AOP(面向切面编程)是一种编程范式,它允许程序员定义“切面”,这些切面封装了特定关注点的实现,如日志、事务管理或安全性。在本示例中,`AOP.rar` 文件显然包含了与Java AOP相关的代码实现,可能是为了改善...

    java AOP aspectjrt-1.8.14 AOP核心大集合

    Java AOP(面向切面编程)是一种编程范式,它允许程序员定义“切面”,这些切面封装了特定的关注点,如日志、事务管理或性能监控。在Java世界中,AspectJ是一个强大的AOP框架,它扩展了Java语言,提供了静态和动态...

    java aop拦截方法类前后添加日志

    在Java开发中,AOP(面向切面编程)是一种强大的设计模式,它允许程序员将关注点从业务逻辑中分离出来,比如日志记录、事务管理、性能监控等。本话题聚焦于如何使用Java AOP来在方法执行前后插入日志记录,这有助于...

    java AOP实现字段加密/解密

    Java AOP(面向切面编程)是一种编程范式,它允许程序员定义“切面”,这些切面封装了特定关注点的代码,如日志、事务管理或安全性,从而提高代码的可重用性和模块化。在Java中,Spring框架提供了对AOP的强大支持。 ...

    java AOP接口防刷代码

    Java AOP(面向切面编程)是Spring框架中的一个重要特性,它允许我们在不修改源代码的情况下,对程序进行功能增强,比如日志记录、权限控制、事务管理等。在这个"java AOP接口防刷代码"中,我们很可能是找到了一种...

    Java AOP 公共异常处理,一个没有try的项目。.zip

    Java AOP(面向切面编程)是Java编程领域中的一个重要概念,它允许程序员定义横切关注点,并将这些关注点与应用程序的业务逻辑分离。在实际开发中,公共异常处理是一个常见的AOP应用场景,用于统一处理可能出现的...

    AOP.rar_aop-bc04_it_java aop

    java aop bible must to read it

    java AOP重要概念.jpg

    java AOP重要概念.jpg

    基于AspectJ的Java AOP项目设计源码

    该项目为君匡出品,采用AspectJ技术实现的Java AOP项目示例源码。项目包含143个文件,其中84个为Java源代码文件,34个为XML配置文件,18个为Markdown文档,5个为AspectJ注解文件,1个为Git忽略配置文件,1个为YAML...

    java AOP原理以及实例用法总结

    Java AOP原理以及实例用法总结 Java AOP(Aspect-Oriented Programming,面向切面编程)是一种编程思想,旨在满足高耦合低内聚的六大原则。AOP通过将横切关注点(cross-cutting concerns)与业务逻辑分离,来提高...

    java aop demo

    Java AOP(面向切面编程)是Java编程领域中一种重要的设计模式,它允许程序员在不修改源代码的情况下,插入新的行为或增强已有功能。在本示例中,我们将探讨如何在Spring Boot框架中实现AOP,从而提高代码的可维护性...

    Java利用spring aop进行监测方法执行耗时

    使用 Spring AOP 进行方法耗时监测的好处有以下几点: 1. 代码实现简单,易于维护:使用 Spring AOP 可以将耗时监测的逻辑与业务逻辑进行解耦,避免业务逻辑代码的冗余和代码维护难度的提高。 2. 安全性高:使用 ...

    Aop.rar_aop_java aop

    AOP(Aspect Oriented Programming,面向切面编程)是Java编程领域中的一种设计模式,它扩展了传统的面向对象编程,允许程序员定义“方面”,这些方面可以包含关注点,如日志、事务管理、性能监控等,这些关注点通常...

    java Spring aop所需Jar包

    Java Spring AOP(面向切面编程)是一种强大的设计模式,它允许程序员在不修改源代码的情况下,通过插入切面来增强或修改已有代码的行为。在Spring框架中,AOP主要用于日志记录、性能监控、事务管理等场景。下面将...

Global site tag (gtag.js) - Google Analytics