`
暮雨风吹
  • 浏览: 16862 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

Spring动态代理实现

阅读更多

今天是学习Spring的第二天,看到了AOP,即AspectOrientedProgramming 面向切面编程,

JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,在并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起。而Proxy为InvocationHandler实现类动态创建一个符合某一接口的代理实例。下面我就用一个实例演示面向切面编程中动态代理的过程。

首先把需要的类引入进来

User类:

 

package com.spring.model;

public class User {

	private String userName;
	private String password;
	
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
}

 

 

接口UserDao:

package com.spring.dao;

import com.spring.model.User;

public interface UserDao {

	public void save(User u);
	
	public void delete();
}


UserDaoImpl:

package com.spring.dao.impl;

import com.spring.dao.UserDao;
import com.spring.model.User;

public class UserDaoImpl implements UserDao{

	public void save(User u) {

		System.out.println("user saved !");
	}
	
	public void delete()
	{
		System.out.println("delete ok !");
	}

}


好了,下面我们要做的事就是写出一个UserDaoImpl类的动态代理类,这个代理类实现的功能是在调用UserDaoImpl类方法的时候提示该方法已经开始执行的语句。代理类LogInterceptor,他实现了InvocationHandler接口

package com.spring.aop;

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

public class LogInterceptor implements InvocationHandler {

	private Object target; //接收被代理类的对象
	
	public Object getTarget() {
		return target;
	}

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

	public void beforeMethod(Method m)
	{
		System.out.println(m.getName()+" start !");
	}
	
	public Object invoke(Object proxy, Method method, Object[] args)  
			throws Throwable {
	             beforeMethod(method);
		method.invoke(target, args);
		return null;
	}
}

 

在接口方法invoke(Object proxy, Methodmethod, Object[] args)里,将目标类实例传给method.invoke()方法,通过反射调用目标类方法。最后就是生成代理类对象并初始化,调用方法查看结果,完成切面编程的过程。以junit进行单元测试,代码如下

 

        @Test
	public void taestProxy()
	{
		UserDao userDao = new UserDaoImpl();
		LogInterceptor li = new LogInterceptor();
		li.setTarget(userDao);
                //为编织了目标业务类逻辑和横切逻辑的LogInterceptor创建代理类
               UserDao proxy = (UserDao)Proxy.newProxyInstance(userDao.getClass().getClassLoader(), 
                                 userDao.getClass().getInterfaces(), li);
		proxy.save(new User());
		proxy.delete();
	}

 

上面的代码完成了业务类代码和横切代码编织和接口代理实例生成的工作,其中在li.setTarget(userDao)处,我们将LogInterceptor实例编织为一个包含业务逻辑和横切逻辑实例,然后在newProxyInstance处,通过Proxy的静态方法newProxyInstance()为融合了业务类逻辑和横切逻辑的LogInterceptor创建一个UserDao接口的代理实例,该方法的第一个入参为类加载器,第二个入参为创建的代理实例所要实现的一组接口,第三个参数是整合了业务逻辑和横切逻辑的编织器对象。简言之这三个参数分别是UserDaoImpl的类加载器、UserDao接口、实现了代理的类LogInterceptor对象,此时UserDaoImpl是被代理的对象


 

运行结果如下

 

 

 

分享到:
评论

相关推荐

    spring+动态代理

    Spring框架提供了一种便捷的方式来实现动态代理,这使得我们可以在不修改原有代码的情况下扩展或增强已有功能。在本篇中,我们将深入探讨Spring如何使用动态代理以及其在实际开发中的应用。 动态代理的核心概念是...

    spring动态代理类的示范小版本,很简单的例子

    在Spring中,动态代理主要有两种实现方式:JDK动态代理和CGLIB代理。它们都是为了实现AOP(面向切面编程)的核心技术。下面将详细介绍这两种动态代理机制。 1. JDK动态代理: JDK动态代理基于Java的接口实现。如果...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    在Java开发中,反射机制是实现动态代理的关键技术之一。反射提供了在运行时访问和操作类的能力,这使得动态代理的实现成为可能。在Java中,可以使用java.lang.reflect包下的相关类和接口实现动态代理。 例如,通过...

    spring动态代理

    这种方式的优点是不需要额外的库,但缺点是只能代理实现了接口的类。 5. **CGLIB代理**: CGLIB(Code Generation Library)是一个代码生成库,可以在运行时为类生成子类并提供代理。Spring 在无法使用 JDK 动态...

    spring之AOP(动态代理)

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

    Spring动态代理

    本篇文章将深入探讨Spring动态代理及其在Spring MVC中的应用,特别是在创建RESTful服务时如何利用注解来实现日志记录。 动态代理是Java提供的一种机制,允许在运行时创建一个接口的实例,该实例可以调用实际目标...

    四、Spring源码分析——动态代理

    在Java中,可以使用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现动态代理。 2. **Spring中的动态代理类型** Spring支持两种类型的动态代理:JDK动态代理和CGLIB代理。 - **JDK...

    springAOP配置动态代理实现

    动态代理则是Spring AOP实现的核心技术之一,它允许我们在运行时创建具有额外行为的对象。下面将详细阐述Spring AOP的配置以及动态代理的实现。 一、Spring AOP基础知识 1. **什么是AOP**:AOP是一种编程范式,...

    反射实现 AOP 动态代理模式(Spring AOP 的实现 原理) - Java 例子 -

    本文将深入探讨Spring AOP的实现原理,以及如何使用反射来实现动态代理模式。 首先,我们需要了解AOP的基本概念。AOP的核心思想是切面,它包含两个主要部分:切点(Pointcut)和通知(Advice)。切点定义了在程序...

    spring jdk动态代理

    Spring AOP允许我们通过代理来实现横切关注点,如日志、事务管理等,而JDK动态代理则是Spring AOP实现的一种方式。本文将深入探讨Spring如何利用JDK动态代理技术来实现这一功能,并通过实例解析其底层实现。 首先,...

    spring 的动态代理详解

    在Spring框架中,动态代理主要用于AOP(面向切面编程)功能的实现,允许开发者在不修改原业务逻辑代码的情况下,添加额外的行为,如权限检查、事务处理等。 #### 动态代理的关键概念 1. **抽象角色**:通常指的是...

    Spring的静态代理和动态代理

    在Java中,可以使用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现动态代理。Spring AOP中的JDK动态代理就是基于此实现的。 Spring通过`DefaultDynamicProxyFactory`和`...

    动态代理和注解Spring.rar

    本资料“动态代理和注解Spring.rar”着重介绍了Spring框架中的两个关键概念:动态代理和注解的使用。 首先,我们来深入了解Spring中的动态代理。动态代理在Spring AOP(面向切面编程)中扮演着重要角色。AOP允许...

    Spring框架中JDK动态代理和cglib动态代理

    在 Spring AOP 框架中,默认情况下,Spring 会选择使用 JDK 动态代理,但是如果目标对象没有实现接口,Spring 就会选择使用 CGLIB 动态代理。这种机制可以确保 Spring AOP 框架可以代理任何类型的对象,无论它是否...

    spring动态代理原理

    通过以上讲解,我们可以看到Spring AOP的动态代理是如何工作的,以及如何通过JDK动态代理实现这一过程。这种机制使得我们的代码更加模块化,增强了代码的可扩展性和可维护性。在实际开发中,Spring AOP动态代理被...

    Java动态代理(Spring Aop原理)

    动态代理提供了创建代理对象的机制,而Spring AOP则是基于动态代理实现的面向切面编程框架,简化了在多处插入相同逻辑的复杂度。在实际开发中,理解并熟练运用这两个技术对于提高代码质量和可维护性至关重要。

    Spring CGLlB动态代理实现过程解析

    "Spring CGLlB动态代理实现过程解析" Spring CGLIB动态代理是Spring框架中的一种动态代理机制,它通过CGLIB(Code Generation Library)生成代理类来实现动态代理。CGLIB是一个高性能的开源代码生成包,能够在运行...

    spring代理实现项目

    在"spring代理实现项目"中,可能会有专门的代理类为具体业务逻辑提供额外的服务,如事务管理、日志记录等。 2. 动态代理: 动态代理则是在运行时动态创建代理对象,不需要预先编写代理类。在Java中,可以使用`java....

Global site tag (gtag.js) - Google Analytics