`
8366
  • 浏览: 799820 次
  • 性别: 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用的多吗?

相关推荐

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

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

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

    NULL 博文链接:https://countme.iteye.com/blog/1130188

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

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

    Aop jdk proxy实现小例子

    使用jdk proxy实现aop机制的一个小例子,写着给新手看看而已,老手们莫见笑

    spring练习项目.7z

    proxy,jdkproxy-transaction,jdkproxy-salary,day02-itheima11-spring-08-cglibproxy,day02-itheima11-spring-09-aop.xml,day02-itheima11-spring-10-aop.xml.advice,day02-itheima11-spring-11-aop.xml.exception等...

    JDK动态代理 spring aop 的原理

    Jdk动态代理,基于接口的代理示例 InovactionHandler Proxy

    JAVA动态代理

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

    AOP的实现机制

    使用动态代理实现AOP需要有四个角色:被代理的类,被代理类的接口,织入器,和InvocationHandler,而织入器使用接口反射机制生成一个代理类,然后在这个代理类中织入代码。被代理的类是AOP里所说的目标,...

    AOP编程示例

    CGlib的Proxy实现AOP的示例、JDK的Proxy实现AOP的示例、通过spring注解方式实现AOP

    spring_aop4.rar_Home Home_jar 转换_spring AOP jar

    1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间...

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

    Spring框架的JDK代理模式底层代码。有助理解Spring的Aop模式的代理

    类似spring Aop的Proxy封装

    有一天在用回调模版的时候,忽然间又想到jdk自带的Proxy类似乎不是怎么好用,为何不把其做成回调模版呢,可以将其改造称类似spring Aop 代码如下: package com.fjx.proxy.up.test; import ...

    cglib aop spring 动态代理

    静态代理--不适合企业开发,适合初学者理解代理。 jdk动态代理--适合企业级开发,但是它要求必须面向接口编程,假如目标类没有实现接口...spring 的AOP功能中 会根据目标类是否实现了接口来判断使用 jdk Proxy还是cglib

    java 实现AOP

     为了简单起见,例子没有没有使用任何第三方的AOP Framework, 而是利用Java语言本身自带的动态代理功能来实现AOP.  让我们先回到AOP本身,AOP主要应用于日志记录,性能统计,安全控制,事务处理等方面。它的主要...

    spring之AOP(动态代理)

    spring之AOP(动态代理),包括jdk动态代理和CGLib动态代理

    使用动态代理演示Spring的AOP编程原理

    为了说明Spring的AOP原理,本人使用代理模式中的动态代理完成演示AOP编程的原理的演示。相信,如果你耐心看完整个程序(几乎一行注释一行代码),那么你对Spring这个东西就不是觉得有什么神秘了! 阅读对象:凡是喜爱...

    基于java的企业级应用开发:JDK动态代理.ppt

    * * * * JDK动态代理 JDK动态代理 JDK动态代理是通过java.lang.reflect.Proxy 类来实现的,我们可以调用Proxy类的newProxyInstance()方法来创建代理对象。对于使用业务接口的类,Spring默认会使用JDK动态代理来实现...

    spring2.5学习PPT 传智博客

    使用JDK中的Proxy技术实现AOP功能 16.使用CGLIB实现AOP功能与AOP概念解释 17.使用Spring的注解方式实现AOP入门 18.使用Spring的注解方式实现AOP的细节 19.使用Spring配置文件实现AOP 20.aspectj的切入点语法...

    Spring_0300_JDKProxy

    简单的动态代理实现代码!文档参考博文Spring学习(3)AOP初步—JDK动态代理

Global site tag (gtag.js) - Google Analytics