`
8366
  • 浏览: 809208 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

第15讲 --使用JDK中的Proxy技术实现AOP功能

阅读更多

 

 

当目标类实现了接口,我们可以使用jdk的Proxy来生成代理对象。

下面我们使用jdk的aop技术为 PersionServiceBean (它本身实现了一个接口)  来产生一个代理对象

 

主要业务:当user对象不为空的时候我们才调用业务方法,否则什么也不做

 

步骤:

 

(1) 建立接口类  PersionSevice

 

package cn.com.xinli.service;


public interface PersionSevice
{
	public void save(String name);
	public void update(String name, Integer personid);
	public String getPersonName(Integer personid);
	
}

 

 

(2)建立实现类 PersionServiceBean

 

package cn.com.xinli.service.impl;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

import cn.com.xinli.service.PersionSevice;
@Service										   
public class PersionServiceBean implements PersionSevice 
{
	Logger log=Logger.getLogger(PersionServiceBean.class);
	
private String user = null;
	
	public String getUser() {
		return user;
	}

	public PersionServiceBean(){}
	
	public PersionServiceBean(String user){
		this.user = user;
	}

	public String getPersonName(Integer personid) {
		System.out.println("我是getPersonName()方法");
		return "xxx";
	}

	public void save(String name) {
		System.out.println("我是save()方法");
	}

	public void update(String name, Integer personid) {
		System.out.println("我是update()方法");
	}

}	

 

 

(3). 建立代理工厂,必须实现 InvocationHandler 接口

 

package cn.com.xinli.aop;

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

import cn.com.xinli.service.impl.PersionServiceBean;



public class JDKProxyFactory implements InvocationHandler{
	private Object targetObject;
	
	public Object createProxyIntance(Object targetObject){
		this.targetObject = targetObject;
		return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(), 
				this.targetObject.getClass().getInterfaces(), this);
	}

	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {//环绕通知
		PersionServiceBean bean = (PersionServiceBean) this.targetObject;
		Object result = null; 
		if(bean.getUser()!=null){
			//..... advice()-->前置通知
			try {
				result = method.invoke(targetObject, args);
				// afteradvice() -->后置通知
			} catch (RuntimeException e) {
				//exceptionadvice()--> 例外通知
			}finally{
				//finallyadvice(); -->最终通知
			}
		}
		return result;
	}

}

 

 

(4)  测试

 

	JDKProxyFactory factory = new JDKProxyFactory();
			PersionSevice service = (PersionSevice) factory.createProxyIntance(new PersionServiceBean("hxl"));
			service.save("ss");

 

(5) 结果 当传入字符传 "huxl" 的时候 打印出 我是save()方法, 当不传字符的时候什么也没有打印.

 

 

总结:

a. 使用jdk的 Proxy类实现代理 体现了面向接口编程,它必须要求需要代理的对象实现了接口,代理工厂实现了 InvocationHandler ,否存我们就要使用另外一种技术 CGLIB实现AOP功能

 

 

b.代码解释

public class JDKProxy implements InvocationHandler {
	private Object targetObject;//代理的目标对象
	public Object createProxyInstance(Object targetObject){
		this.targetObject = targetObject;
/*
* 第一个参数设置代码使用的类装载器,一般采用跟目标类相同的类装载器
* 第二个参数设置代理类实现的接口
* 第三个参数设置回调对象,当代理对象的方法被调用时,会委派给该参数指定对象的invoke方法
*/
		return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),
				this.targetObject.getClass().getInterfaces(), this);
	}
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		return method.invoke(this.targetObject, args);//把方法调用委派给目标对象
	}
}
当目标类实现了接口,我们可以使用jdk的Proxy来生成代理对象。

 

 

 

分享到:
评论
1 楼 zhangyou1010 2009-09-29  
好东西,收藏了。谢谢博主。请问博主平时spring用的多吗?

相关推荐

    AOP__使用JDK中的Proxy技术实现AOP功能

    在Java中,我们可以使用JDK的动态代理(Proxy)来实现AOP的功能,这主要涉及到反射和接口编程。 **JDK动态代理的工作原理** JDK的Proxy类提供了一种机制,可以创建一个代理对象,该对象在调用方法时会执行自定义的...

    使用JDK中的Proxy技术实现AOP功能与使用CGLIB实现AOP功能

    本篇将深入探讨如何使用JDK的动态代理和CGLIB库来实现Spring中的AOP功能。 首先,我们来看JDK中的Proxy技术。JDK Proxy是Java提供的一种动态代理机制,它允许我们在运行时创建一个实现了特定接口的新类。这个新类...

    Spring Aop的底层实现技术 --- Jdk动态代理原理

    Spring AOP 的底层实现技术 --- Jdk 动态代理原理 JDK 动态代理是 Spring AOP 的底层实现技术,允许开发者在运行期创建接口的代理实例。在 JDK 1.3 以后,JDK 动态代理技术提供了实现 AOP 的绝好底层技术。JDK 动态...

    Aop jdk proxy实现小例子

    下面我们将详细讲解如何使用JDK Proxy实现Aop。 首先,我们需要定义一个接口,这个接口将代表我们要进行代理的目标对象的行为。例如,我们可以创建一个名为`Service`的接口: ```java public interface Service { ...

    AOP_1.入门及使用JDK中的Proxy技术实现实例

    在Java领域,我们可以使用Spring框架提供的AOP支持,但本实例主要讨论的是如何使用JDK自身的动态代理(Proxy)技术来实现AOP。 JDK的Proxy类提供了创建动态代理对象的能力,这个代理对象可以代表一个或多个实现了...

    java-jdk1.6-jdk-6u45-windows-x64.zip

    2. 动态代理:引入了`java.lang.reflect.Proxy`类,使得动态创建代理对象成为可能,便于实现AOP(面向切面编程)。 3. NIO.2:Java 7引入了NIO.2,但1.6版本已经包含了一些改进,如更好的文件系统访问API,异步I/O...

    Spring学习笔记(14)----使用CGLIB实现AOP功能

    在本篇Spring学习笔记中,我们将探讨如何使用CGLIB库来实现AOP功能。 CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它被广泛用于动态代理和运行时织入AOP切面。在Spring中,如果目标类没有...

    Spring-AOP-JDK动态代理

    本篇将详细讲解Spring中的AOP实现,特别是JDK动态代理的应用。 首先,我们要了解什么是AOP(Aspect Oriented Programming,面向切面编程)。AOP是一种编程范式,旨在解决应用程序中分散的、横切关注点的问题,如...

    Java JDK 实现AOP

    AOP的实现技术主要包括两大类: 1. **动态代理**:通过截取方法调用的方式,在不修改原有对象行为的基础上添加额外的功能。这种方式适用于运行时动态地改变行为。 2. **静态织入**:通过引入特定的语法创建“方面”...

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

    在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者定义“切面”,...通过理解JDK动态代理的工作原理和Spring AOP的相关概念,我们可以更好地利用这一强大功能,提升应用程序的可维护性和灵活性。

    JDK动态代理 spring aop 的原理

    在Java编程领域,JDK动态代理是实现动态创建代理对象的一种技术,它是Java标准库提供的一种强大工具。Spring AOP(面向切面编程)则是一种流行的应用框架,它利用动态代理来实现对业务代码的切面增强,如日志、事务...

    从JDK动态代理到spring AOP

    本篇将详细探讨JDK动态代理和Spring AOP,以及它们在实际应用中的作用。 首先,JDK动态代理是Java提供的一种在运行时创建代理对象的技术。它允许我们在不修改原有类的基础上,为已有接口添加额外的功能。动态代理的...

    JDK-proxy-mode-spring-source-code-.zip_spring code

    在Spring框架中,JDK代理模式是实现AOP(面向切面编程)的一种方式,它允许我们在不修改原有代码的基础上,动态地为对象添加额外的功能。JDK代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect....

    SpringIOC,DI+dynamic proxy 实现盗版AOP

    本文将深入探讨如何使用Spring的IOC和DI特性,结合动态代理(Dynamic Proxy)来实现一种类似AOP(面向切面编程)的功能,以达到在不修改原有代码的情况下增强或拦截方法调用的目的。 **一、Spring IOC(控制反转)*...

    代理模式,JDK动态代理,SpringAOP来龙去脉

    - 展示Spring AOP的配置,定义切面、通知以及如何在业务代码中使用。 7. **优缺点**: - JDK动态代理简单易用,但仅适用于实现了接口的目标对象。 - Spring AOP更强大,支持多种代理方式和通知类型,但可能带来...

    spring-aop AND proxy

    标题中的“spring-aop”指的是Spring框架中的面向切面编程(Aspect-Oriented Programming, AOP)模块,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。AOP的核心概念包括切面(Aspect)、通知...

    fckeditor-java-2.4.1修改支持jdk1.4

    3. **动态代理**:如果使用了`java.lang.reflect.Proxy`,可能需要使用其他方式实现类似功能,比如静态代理或AOP框架。 4. **其他新特性**:包括try-with-resources、变长参数、foreach循环等,都需要相应地进行...

    JavaEE JDK动态代理实现AOP切面功能

    JavaEE JDK动态代理是Java平台中实现面向切面编程(AOP)的一种方式,它允许我们在不修改原有代码的情况下,为已有对象添加额外的功能。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect...

    spring-demo16-JDK动态代理.zip

    "spring-demo16-JDK动态代理.zip"这个压缩包可能包含了关于如何在Spring中使用JDK动态代理的一个示例项目。 JDK动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。...

    day39-Spring 03-JDK的动态代理

    JDK通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现了这一功能。Proxy类用于创建代理对象,而InvocationHandler接口定义了代理对象如何处理方法调用。 在Spring AOP中,动态代理...

Global site tag (gtag.js) - Google Analytics