`
wangxinxin1212
  • 浏览: 29380 次
社区版块
存档分类
最新评论

java动态代理(AOP)初探

    博客分类:
  • java
阅读更多

       最近在做项目时发现公司的产品都是基于公司搭建好的基础框架进行开发,由于基础框架已经进行了高度封装,这样好处是能够快速开发新功能,但是很快就发现有好多东西都是重复的。于是决定开发一个工具类,用来生成一些固定模版的代码。在写这个工具类时用到了大量的反射技术,为了更好的了解反射技术,便找来几本书来参考,便看到了java的AOP(面向切面)。之前有了解过,但是云里雾里的。为了更好的理解面向切面参考《疯狂java系列》自己写了小列子加强对“面向切面”的了解。这个例子很浅,如需要深入研究请参考其他资料。

       这个列子是用人类上厕所为列。这里抽象人类上厕所的步骤为3步(1,脱动作,2.采用什么姿势,3,穿动作)。这个例子可能有点俗。人类分为男,女。无论男,女上厕所的步骤都可以抽象成这三个步骤,(1,3)的动作是一样的,但是(2)步可就不一样了。那么问题就来了。怎么在(2)动作的前后执行(1)和(3)步骤呢。下面看代码实现:

主要通过Proxy与InvocationHandler类生成代理

package com.daxingzsh.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * java动态代理
 * 面向切面编程
 * AOP
 * @author xinxin
 *
 */
public class GoToilot {
	
	public static void main(String[] args){
		People target1 = new Woman();
		People target2 = new Man();
		People woman = ProxyFactory.getProxy(target1);
		People man = ProxyFactory.getProxy(target2);
                //使用代理生成的对象被切入了业务逻辑
		woman.goToilot();
		System.out.println("-------------------------");
		man.goToilot();
	}
	
}

/**
 * 代理工厂
 * @author xinxin
 *
 */
class ProxyFactory{
	@SuppressWarnings("unchecked")
	public static <T> T getProxy(T target){
		MyInvockHander hander = new MyInvockHander(target);
		return (T)Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), hander);
	}
}

/**
 * 动态代理
 * 将处理逻辑切入被代理对象方法
 * @author xinxin
 *
 */
class MyInvockHander implements InvocationHandler{

	private Object target;
	public MyInvockHander(Object target){
		this.target = target;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		PeopleGoToToilot toToilot = new PeopleGoToToilot();
		//在调用被代理对象方法前执行处理逻辑
		toToilot.start();
		Object result = method.invoke(target, args);
		//在调用被代理对象方法后执行处理逻辑
		toToilot.end();
		return result;
	}
	
}

/**
 * 人类接口
 * @author xinxin
 *
 */
interface People{
	
	/**
	 * 上厕所抽象方法
	 */
	public void goToilot();
}

/**
 * 女人实现类
 * @author xinxin
 *
 */
class Woman implements People{

	@Override
	public void goToilot() {
		System.out.println("女:蹲式");
	}
	
}

/**
 * 男人实现类
 * @author xinxin
 *
 */
class Man implements People{

	@Override
	public void goToilot() {
		System.out.println("男:站式");
	}
	
}

/**
 * 上厕所业务类
 * @author xinxin
 *
 */
class PeopleGoToToilot{
	
	public void start(){
		System.out.println("脱");
	}
	
	public void end(){
		System.out.println("穿");
	}
}

 

分享到:
评论

相关推荐

    用Java动态代理实现AOP

    Java动态代理实现AOP Java动态代理是实现Aspect Oriented Programming(AOP)的重要手段。在Java中,动态代理可以通过java.lang.reflect InvocationHandler接口和java.lang.reflect.Proxy类来实现。AOP的主要思想...

    用java自己实现的动态代理 AOP

    Java动态代理是Java编程中一个重要的特性,它允许在运行时创建代理对象,这些代理对象可以作为原有对象的代理,实现在调用原有方法前后添加额外的功能,这正是AOP(面向切面编程)的核心思想。下面我们将深入探讨...

    java动态代理实例aop

    Java动态代理是Java编程中一个非常重要的特性,它在实际开发中被广泛应用于面向切面编程(Aspect-Oriented Programming,简称AOP)领域。AOP是一种编程范式,旨在提高代码的可重用性和模块化,通过将关注点分离,...

    java 动态代理实现AOP

    讲述JAVA的动态代理的原理,以及通过JAVA的动态代理来实现AOP。简洁,易懂,学习AOP的入门级文档

    Java动态代理(Spring Aop原理)

    在Spring框架中,AOP(面向切面编程)就是基于Java动态代理来完成的,用于实现横切关注点,如日志、事务管理等。这篇博客的文章链接虽然没有给出具体内容,但我们可以根据Java动态代理和Spring AOP的基本概念来深入...

    java分页 动态代理 aop实现

    本话题主要围绕"Java分页"、"动态代理"以及"AOP(面向切面编程)"在Spring框架中的实现进行详细讲解。 首先,我们来看"Java分页"。在处理大量数据时,一次性加载所有数据不仅会消耗大量的内存,也可能导致用户界面...

    spring之AOP(动态代理)

    在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...

    动态代理和AOP详解

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

    java动态代理 经典文章(word 2007格式的)

    - `设计模式:用Java动态代理实现AOP.docx`可能包含了如何使用Java动态代理来实现设计模式,尤其是代理模式,以达到AOP的效果。 - `Spring AOP入门实例详解.docx`可能涵盖了Spring AOP的基本概念、配置以及如何...

    java-用Java动态代理实现AOP.pdf

    java-用Java动态代理实现AOP.pdf

    论文研究-Java动态代理在AOP中的应用 .pdf

    Java动态代理在AOP中的应用,薄栋,邓芳,AOP(Aspect-Oriented-programming)是一种支持横切关注点的分解的技术,表达更高的抽象层次。它对于横切关注点就像面向对象程序设计对于对象�

    Java动态代理在AOP中的应用

    本文首先介绍了AOP 的基本思想,然后针对它在JAVA 语言 中的实现,具体介绍了JAVA 的动态代理来怎样实现一个简单的AOP 容器

    2022年Java动态代理实现AOPJava教程.docx

    Java 动态代理是实现AOP(面向切面编程)的一种高效途径,它允许开发者在不修改原有业务逻辑代码的情况下,插入额外的功能,如日志记录、性能监控、权限控制等。AOP的核心思想是将关注点分离,使得业务代码与横切...

    个人用java动态代理模拟实现spring aop

    Java动态代理是Java提供的一种在运行时创建新类型对象的技术,它可以让我们在不修改原有代码的情况下,对方法的调用进行增强,这正是Spring AOP(面向切面编程)的核心思想。Spring AOP通过代理模式实现了对业务逻辑...

Global site tag (gtag.js) - Google Analytics