`

CGLIB实现代理demo

阅读更多
在上片文章里说了如何用jdk自带的类Proxy来实现代理,但是在使用Proxy时要注意:目录类必须实现接口,如果目标类没有实现接口的话,可以用cglib.jar类实现代理。
1、首先从网上找到cglib进行下载,我这里用的是cglib-nodep-2.1_3.jar
2、新建java项目 CGLIBAop
2、在项目中创建程的Person.java
package cn.ehoo.bean;

/**
 * @author whp
 * @Email whp@ehoo.cn
 * @Jan 4, 2011
 * 
 */
public class Person {
	private Long id;
	private String name;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}


2、创建目标类PersonServiceBean.java
PersonServiceBean.java
package cn.ehoo.service.impl;

import cn.ehoo.bean.Person;

/**
 *@author whp
 *@Email whp@ehoo.cn
 *@Jan 4, 2011
 *
 */
public class PersonserviceBean {
	private String user;
	public String getUser() {
		return user;
	}
	public void setUser(String user) {
		this.user = user;
	}
	public PersonserviceBean() {
		super();
	}
	public PersonserviceBean(String user) {
		super();
		this.user = user;
	}
	public void save(Person person){
		System.out.println("执行PerServiceBean的save方法");
	}
}


3、创建代理类
package cn.ehoo.aop;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import cn.ehoo.service.impl.PersonserviceBean;

/**
 * @author whp
 * @Email whp@ehoo.cn
 * @Jan 4, 2011
 * 
 * 
 */
public class CGLIBFactory implements MethodInterceptor {
	Object targetObject;// 目标对象

	public Object createCglibIntenc(Object targetObject) {
		this.targetObject = targetObject;
		Enhancer enhancer = new Enhancer();//通过类Enhancer创建代理对象
		enhancer.setSuperclass(this.targetObject.getClass());//传入创建代理对象的类
		enhancer.setCallback(this);//设置回调
		return enhancer.create();//创建代理对象

	}

	@Override
	public Object intercept(Object arg0, Method method, Object[] args, MethodProxy arg3) throws Throwable {
		PersonserviceBean bean = (PersonserviceBean) targetObject;// 因为在程序里targetObject为PersonServiceBean
		Object result = null;
		if (bean.getUser() != null)// 判断user是否为空
			result = method.invoke(targetObject, args);// 如果不为空交给目标对象进行处理.
		// TODO Auto-generated method stub
		return result;
	}

}



4、cglib与Proxy的主要区别是cgilib创建代理不需要目标类实现接口,但Proxy类需要目标类实现接口。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics