`
perfect5085
  • 浏览: 271642 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java中AOP技术详解

 
阅读更多

 

AOP是Aspect Oriented Programming的缩写,意思是面向方面编程,与OOP(Object Oriented Programming)面向对象编程对等,都是一种编程思想。
从OOP角度分析,我们关注业务的处理逻辑,是属于纵向的行为,从AOP角度分析,我们关注对象行为发生时的问题,是属于横向的行为。

AOP 作用:
1	监控函数的调用
2	捕获异常发生

实际应用在:事务、安全、日志等横切关注。

两种实现AOP的方式:
	1,JDK提供的动态代理实现 
//接口
public interface UserBean
{
	void getUser();
	void addUser();
	void updateUser();
	void deleteUser();
}
//原始实现类
public class UserBeanImpl implements UserBean
{
	private String user = null;
	public UserBeanImpl()
	{		
	}	
	public UserBeanImpl(String user)
	{
		this.user = user;
	}	
	public String getUserName()
	{
		return user;
	}	
	public void getUser()
	{
		System.out.println("this is getUser() method!");
	}

	public void setUser(String user)
	{
		this.user = user;
		System.out.println("this is setUser() method!");
	}
	public void addUser()
	{
		System.out.println("this is addUser() method!");
	}
	
	public void updateUser()
	{
		System.out.println("this is updateUser() method!");
	}	
	public void deleteUser()
	{
		System.out.println("this is deleteUser() method!");  
	}		
}
//代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.cignacmc.finance.bean.UserBeanImpl;

public class UserBeanProxy implements InvocationHandler
{
	private Object targetObject;
	
	public  UserBeanProxy(Object targetObject)
	{
		this.targetObject = targetObject;		
	}
	
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
	{
		UserBeanImpl userBean = (UserBeanImpl) targetObject;
		String userName = userBean.getUserName();
		Object result = null;
		
		//权限判断
		if(userName != null && !"".equals(userName))
		{
			result = method.invoke(targetObject, args);
		}
		
		return result;
	}
}

//测试类
import java.lang.reflect.Proxy;

import com.cignacmc.finance.bean.UserBean;
import com.cignacmc.finance.bean.UserBeanImpl;
import com.cignacmc.finance.proxy.UserBeanProxy;

public class ProxyExe
{
	public static void main(String[] args)
	{
		System.out.println("Proved.............");
		UserBeanImpl targetObject = new UserBeanImpl("Bob Liang");		
		UserBeanProxy proxy = new UserBeanProxy(targetObject);
		//生成代理对象		
		UserBean object = (UserBean)Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), 
				targetObject.getClass().getInterfaces(), proxy);
		object.addUser();
		
		System.out.println("NO Proved.............");
		targetObject = new UserBeanImpl();		
		proxy = new UserBeanProxy(targetObject);
		//生成代理对象		
		object = (UserBean)Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), 
				targetObject.getClass().getInterfaces(), proxy);
		object.addUser();
				
	}
}

输出:
Proved.............
this is addUser() method!
NO Proved.............

从上面这个例子可以成功拦截了调用的方法addUser()并对其做了相应的处理 

	2, 通过cglib创建代理类, 好处是不要求我们的目标对象实现接口
//原始类
public class ClientBean
{
	private String name = null;

	public ClientBean()
	{

	}

	public ClientBean(String name)
	{
		this.name = name;
	}

	public void addClient()
	{
		System.out.println("this is addClient() method!");
	}

	public void deleteClient()
	{
		System.out.println("this is deleteClient() method!");
	}

	public void getClient()
	{
		System.out.println("this is getClient() method!");
	}

	public void updateClient()
	{
		System.out.println("this is updateClient() method!");
	}

	public String getClientName()
	{
		return name;
	}

	public void setClientName(String name)
	{
		this.name = name;
	}
}
//代理类
import java.lang.reflect.Method;

import com.cignacmc.finance.bean.ClientBean;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class CGLibProxy implements MethodInterceptor
{
	private Object targetObject;
	
	public Object createProxyObject(Object targetObject)
	{
		this.targetObject = targetObject;
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(this.targetObject.getClass());
		enhancer.setCallback(this);
		return enhancer.create();
	}
	
	public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable
	{
		ClientBean clientBean = (ClientBean)targetObject;
		String userName = clientBean.getClientName();
		Object result = null;
		
		if(userName != null && !"".equals(userName))
		{
			result = method.invoke(targetObject, args);
		}
		return result;
	}
}
//测试类
import java.lang.reflect.Proxy;

import com.cignacmc.finance.bean.ClientBean;
import com.cignacmc.finance.bean.UserBean;
import com.cignacmc.finance.bean.UserBeanImpl;
import com.cignacmc.finance.proxy.CGLibProxy;
import com.cignacmc.finance.proxy.UserBeanProxy;

public class ProxyExe
{
	public static void main(String[] args)
	{	
		System.out.println(".............CGLIB Proxy....................");
		System.out.println("Proved....................");
		CGLibProxy cproxy = new CGLibProxy();
		ClientBean clientBean = (ClientBean)cproxy.createProxyObject(new ClientBean("Bob Liang"));
		clientBean.addClient();
		
		System.out.println("NO Proved....................");
		cproxy = new CGLibProxy();
		clientBean = (ClientBean)cproxy.createProxyObject(new ClientBean());
		clientBean.addClient();
				
	}
}

输出:
.............CGLIB Proxy....................
Proved....................
this is addClient() method!
NO Proved....................


切面(Aspect):对横切关注点的抽象(类似类对对象的抽象) 
连接点(JoinPoint):被拦截到的点,泛指方法 
切入点(CutPoint):对哪些连接点进行拦截的定义 
通知(Advice):在特定的连接点,AOP框架执行的动作.前置/后置/例外/最终/环绕通知(调用方法之前执行,全部执行完毕之后) 
引入(Introduction): 添加方法或字段到被通知的类。 Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现 IsModified接口,来简化缓存。 
目标对象(Target Object): 包含连接点的对象。也被称作 被通知或被代理对象。 
AOP代理(AOP Proxy): AOP框架创建的对象,包含通知。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。 
织入(Weaving): 组装方面来创建一个被通知对象。这可以在编译时 完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样, 在运行时完成织入。 
分享到:
评论
2 楼 weizhikang1992 2016-06-22  
[b]
[flash=200,200][list]
[*]
引用
[/list]          [/flash]
[/b]
1 楼 lizhengzy 2015-07-04  

    [啊啊啊]

相关推荐

    Java JDK 实现AOP

    ### Java JDK 实现AOP详解 #### AOP的起源与发展 面向方面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,由施乐公司帕洛阿尔托研究中心(Xerox PARC)在20世纪90年代发明。AOP的初衷是为了更好地...

    开源框架spring详解-----AOP的深刻理解

    标题 "开源框架spring详解-----AOP的深刻理解" 指向的是对Spring框架中核心概念之一的面向切面编程(Aspect Oriented Programming, AOP)的深入探讨。AOP是Spring用来解决横切关注点问题的一种编程模式,它允许...

    Tomcat与Java_Web开发技术详解4.pdf

    ### Tomcat与Java Web开发技术详解 #### 一、Tomcat简介 Tomcat是一款开源的Servlet容器,由Apache软件基金会下属的Jakarta项目开发。它实现了Servlet和JSP规范,可以作为独立的Web服务器来运行Java Web应用程序。...

    java Spring AOP详解及简单实例

    Java Spring AOP详解及简单实例 一、什么是AOP AOP(Aspect Oriented Programming)是面向切面编程,它不同于OOP(Object Oriented Programming)面向对象编程。AOP是将程序的运行看成一个流程切面,其中可以在切...

    spring注解aop配置详解

    在传统的AOP配置中,我们需要定义切入点表达式和通知(advice)在XML配置文件中。然而,使用注解可以让这些配置变得更加直观和易于维护。例如,我们可以使用`@Aspect`注解来定义一个切面类,`@Before`、`@After`、`@...

    spring-springMVC开发文档和AOP详解

    最后,《Spring3_AOP详解》深入剖析了Spring的AOP特性。AOP是面向切面编程的缩写,它允许我们在不改变原有代码结构的情况下,插入额外的功能,如日志、事务管理和性能监控等。通过代理机制,AOP可以在运行时将“切面...

    动态代理和AOP详解

    动态代理和AOP是Java和Spring框架中的重要概念,它们为开发者提供了强大的代码复用和模块化设计的能力。本文将深入解析这两个主题,并结合提供的源码进行详细讲解。 首先,让我们了解一下动态代理。在Java中,动态...

    AOP技术的操作步骤说明以及相关的.java源码

    **AOP技术详解及.java源码解析** AOP(Aspect Oriented Programming,面向切面编程)是软件开发中的一种设计理念,旨在将关注点分离,提高代码的可复用性和可维护性。它允许程序员定义“切面”,这些切面封装了特定...

    基于java的企业级应用开发:Spring AOP简介.ppt

    **AOP术语详解** 1. **Aspect**:切面是AOP的核心概念,它封装了特定的横切关注点,例如事务管理和日志记录。一个切面可以包含多个通知(Advice)和切点(Pointcut)。 2. **Joinpoint**:连接点是指程序执行过程...

    [独门架构:Java Web开发应用详解].李宁.著

    总的来说,《独门架构:Java Web开发应用详解》是一本全面覆盖Java Web开发技术的书籍,无论你是初学者还是经验丰富的开发者,都能从中获取宝贵的实战经验和深入理解。通过阅读和实践书中的内容,你将能够构建出高效...

    JAVA基础技术框架详解二.pdf

    本资源摘要信息中,我们将详细介绍 Java 相关技术框架的各种知识点,涵盖了 Java 语言基础、Java 虚拟机(JVM)、Java 集合框架、Java 并发编程、Java 网络编程、数据存储技术等方面的知识。 Java 语言基础 * Java...

    Java 注解技术视频详解

    在实际开发中,Java注解广泛应用在许多领域,如Spring框架中的依赖注入、AOP切面编程、JSR303/JSR349 Bean Validation数据校验、JPA实体关系映射等。通过注解,我们可以减少配置文件的使用,使代码更简洁,同时也...

    《Java.Web开发详解》的源代码

    《Java.Web开发详解》是一本深入探讨Java在Web开发中的应用的专业书籍,其源代码提供了丰富的实例和练习,帮助读者更好地理解和实践所学知识。在本文中,我们将深入解析这些源代码,探讨其中的关键知识点,旨在提升...

    AOP技术总结 2

    ### AOP技术详解 #### 一、AOP技术概述 AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在通过将横切关注点与核心业务逻辑分离来提高软件的模块化程度。该技术由施乐公司的帕洛阿尔托研究...

    Spring之AOP配置文件详解

    ### Spring之AOP配置文件详解 #### 一、前言 在Java开发中,Spring框架因其强大的功能和灵活的配置而被广泛应用于企业级应用的开发。其中,面向切面编程(Aspect Oriented Programming,简称AOP)是Spring框架的...

    Tomact 与Java Web开发技术详解(第二版)

    《Tomcat与Java Web开发技术详解(第二版)》是一本深入探讨Java Web开发和Tomcat服务器使用的专业书籍。书中包含了大量的实例代码,旨在帮助读者更好地理解和应用相关技术。以下是对书中涉及的主要知识点的详细解释...

    maven工程AOP实现demo

    ** Maven工程AOP实现Demo详解 ** 在Java开发中,Maven是一个不可或缺的构建工具,它可以帮助我们管理项目依赖、构建应用以及执行自动化任务。而AOP(Aspect Oriented Programming,面向切面编程)则是Spring框架的...

    Java Web开发应用详解

    《Java Web开发应用详解》是一本深度探讨Java Web技术的专业书籍,旨在帮助开发者全面理解并掌握Java在Web领域的应用。本书可能涵盖了从基础概念到高级技术的诸多方面,包括Servlet、JSP、JavaServer Faces(JSF)、...

    springAOP详解

    ### Spring AOP 详解 #### 5.1 AOP 基本思想 **5.1.1 认识 AOP** AOP (Aspect Oriented Programming) 面向切面编程,是一种软件开发思想,它允许开发者将那些分散在整个应用各处的“切面”(如日志记录、安全控制...

Global site tag (gtag.js) - Google Analytics