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

\(^_^)/ JDK动态代理模拟Spring的AOP

    博客分类:
  • Code
 
阅读更多

参考:http://dyygusi.iteye.com/blog/1997231

参考:http://550516671-qq-com.iteye.com/blog/833816

 

 

 

代理类:

package spring.mock;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class MockSpringAOP implements InvocationHandler {
	private Object target;

	public MockSpringAOP(Object obj) {
		this.target = obj;
	}

	public void setTarget(Object target) {
		this.target = target;
	}

	public void before() {
		System.out.println("这是一个前置通知");
	}

	public void afterReturning() {
		System.out.println("这是一个后置通知");
	}

	public void afterThrowing() {
		System.out.println("这是一个异常通知");
	}

	public void after() {
		System.out.println("这是一个最终通知");
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		Object returnVal = null;
		try {
			before();
			returnVal = method.invoke(target, args);
			afterReturning();
		} catch (Exception e) {
			afterThrowing();
		} finally {
			after();
		}
		return returnVal;
	}

}

 

 

 

代理对象

package spring.mock;
public class User {
    Integer id;
    String name;
    String pwd;
    public User() {
    }

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }
}






package spring.mock;

public interface UserDAO {
	public void addUser(User user);
}







package spring.mock;

public class UserDAOImpl implements UserDAO {

	@Override
	public void addUser(User user) {
		System.out.println("保存User到数据库中");
		throw new RuntimeException();
	}

}

 

 

 

测试

package spring.mock;

import java.lang.reflect.Proxy;

public class Test {
	public static void main(String[] args) {

		UserDAO userDao = new UserDAOImpl();
		MockSpringAOP interceptor = new MockSpringAOP(userDao);
		// 通过代理的静态方法创建一个代理对象
		// 这个代理创建的时候,接收了接口类型和拦截器的处理类,在代理的背后,他会调运拦截器的invoke这个方法。
		// 因为传递的有接口类型,所以可以强制类型转换到我们指定的接口类型
		UserDAO userDaoProxy = (UserDAO) Proxy.newProxyInstance(interceptor.getClass().getClassLoader(), userDao.getClass().getInterfaces(), interceptor);
		// 然后在代理对象处理的时候,就会将我的逻辑织如到被代理的对象上
		userDaoProxy.addUser(new User(1, "a", "b"));
	}
}

 

 

 

分享到:
评论

相关推荐

    以注解方式模拟Spring IoC AOP

    - **基于代理的AOP**:Spring使用JDK动态代理或CGLIB动态代理创建目标对象的代理,代理对象在调用目标方法前后执行切面逻辑。 - **基于注解的AOP**:Spring支持在方法上直接定义切面注解,如`@Before`, `@After`, `...

    模拟spring aop【一】基于jdk动态代理实现的aop

    本篇文章将探讨如何通过JDK动态代理实现Spring AOP的基础知识。 首先,我们要理解什么是JDK动态代理。在Java中,动态代理机制允许我们在运行时创建一个实现了特定接口的新类。这个新类的实例可以代理目标对象,执行...

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

    在本主题中,我们将探讨如何使用Java动态代理来模拟实现Spring AOP的功能。 首先,我们需要了解Java中的两种动态代理机制:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口实现,适用于目标对象实现了接口的情况...

    Spring AOP简单模拟

    有JDK动态代理和CGLIB代理两种方式,前者针对接口,后者针对类。 接下来,我们将模拟实现Spring AOP: 1. **定义切面**:创建一个类,声明切面并定义通知。例如,我们可以创建一个`LoggingAspect`类,其中包含一个...

    Spring_AOP_Demo

    Spring支持两种AOP代理:JDK动态代理和CGLIB代理。JDK动态代理适用于接口实现类,而CGLIB代理则用于没有实现接口的类。Spring会根据目标对象是否实现了接口自动选择合适的代理方式。 四、AOP配置 在Spring中,可以...

    SpringAOP的实现机制(底层原理)、应用场景等详解,模拟过程的实例

    我们还提供了实际示例,演示如何在Spring AOP中使用JDK动态代理。 CGLib动态代理: 我们将深入研究CGLib动态代理,它允许您在不需要接口的情况下创建代理对象。您将了解CGLib的工作原理,以及如何生成子类来实现...

    java中动态代理,springAop.pdf

    Spring AOP(面向切面编程)也与此密切相关,它使用动态代理来实现切面的织入,从而提供横切关注点,如日志、事务管理等。现在,我们深入探讨Java动态代理和Spring AOP。 首先,让我们从Java动态代理开始。在Java中...

    Spring模拟aop静态代理案例

    本案例"Spring模拟aop静态代理案例"旨在帮助开发者深入理解Spring AOP在实际应用中的运作方式,特别是静态代理的概念。 AOP(Aspect Oriented Programming)是一种编程范式,它允许程序员将关注点(如日志、事务...

    简单模拟spring cglib代理

    Spring支持两种代理机制:基于接口的JDK动态代理和基于类的CGLIB代理。 CGLIB(Code Generation Library)是一个强大的高性能代码生成库,其底层是通过使用操作Java字节码的开源字节码操作框架(比如ASM)来实现的...

    静态代理动态代理测试,模拟jdk实现动态代理

    在实际应用中,动态代理常用于AOP(面向切面编程)场景,例如Spring框架中的AOP代理就是基于JDK动态代理或者CGLIB来实现的,可以在方法调用前、后或异常时插入自定义的行为。 通过上述的静态代理和动态代理的讲解,...

    Spring切面AOP编程的简单模拟实现

    本教程将通过模拟Spring AOP来阐述如何实现一个简单的切面编程。我们将讨论以下几个核心概念:切面、通知、连接点和代理。 首先,我们要理解什么是切面。在AOP中,切面是关注点的模块化,它结合了“横切关注点”...

    jdk动态代理使用[文].pdf

    这种机制在很多场合下都非常有用,比如AOP(面向切面编程)框架如Spring,它们就大量使用了JDK动态代理来实现事务管理、权限控制等功能。总的来说,理解和掌握JDK动态代理是Java开发者必备的技能之一,它能够帮助...

    Spring AOP代码示例

    Spring支持两种代理类型:JDK动态代理和CGLIB代理。前者适用于目标对象实现有接口的情况,后者则用于没有接口的目标对象。 在`springboot-aop`这个项目中,你可能会看到以下内容: 1. 定义切面类(Aspect):使用`...

    自己动手模拟spring

    8. **代理模式**:在实现AOP时,我们需要了解和使用代理模式,如JDK动态代理和CGLIB代理,来在运行时创建代理对象以实现切面逻辑。 通过这个模拟过程,我们可以深入理解Spring框架的工作原理,同时也能提升自己的...

    模拟实现spring IOC AOP的例子

    Spring AOP通过代理模式实现,可以是JDK动态代理或CGLIB代理,这取决于你的Bean是否实现了接口。 在实际的项目中,使用Eclipse开发工具可以极大地提升效率。在提供的压缩包中,有两个项目——`springIocSimulation`...

    JDK动态代理

    在实际项目中,我们常常结合Spring AOP或AspectJ等第三方库来实现更复杂的动态代理功能。这些库提供了更高级的抽象,可以让我们更方便地定义切面和通知。 总的来说,JDK动态代理是Java中一个强大的工具,它让我们的...

    SpringAOP例子

    《SpringAOP实战示例——基于Spring in action 2ed chapter4》 Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许我们通过分离关注点来编写更整洁、可维护的代码。在"Spring in action 2nd edition"的...

    JDK内置动态代理例子

    5. **应用场景**:动态代理常用于AOP(面向切面编程)框架,如Spring AOP,它可以提供一种优雅的方式来添加横切关注点,如日志、事务管理等,而无需修改原始业务代码。此外,动态代理也在测试、数据访问、远程调用等...

    Spring AOP示例

    Spring支持JDK动态代理和CGLIB代理。 在"TestSpringAOP"这个示例中,我们可能会看到以下内容: 1. **配置文件**:可能包含了对AOP的配置,如启用AOP代理、定义切面和切入点等。在XML配置中,我们可能找到`<aop:...

Global site tag (gtag.js) - Google Analytics