Proxy兑现代理demo

Proxy实现代理demo
save、update、insert方法,只有在用户登录后才能对这些方法进行访问,如果没有登录则不允许对用户进行访问。

对于这个问题,我们不能在每个方法里对user进行判断,这样做不但增加程序重复代码的数量,还影响代码的美观Proxy兑现代理demo

所以我们可以使用jdk为我们提供的Proyx来实现目录类,这样就会产生一个动态代理,在这个动态代理类里对user进行判断,如果user不为空,就把方法的调用接给目标类进行执行。

1、用户建一个java项目AOP。
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、创建PersonService.java与PersonServiceBean.java

PersonService.java
package cn.ehoo.service;

import cn.ehoo.bean.Person;

/**
 *@author whp
 *@Email whp@ehoo.cn
 *@Jan 4, 2011
 *
 */
public interface PersonService {

	public void save(Person person);

}


PersonServiceBean.java
package cn.ehoo.service.impl;

import cn.ehoo.bean.Person;
import cn.ehoo.service.PersonService;

/**
 *@author whp
 *@Email whp@ehoo.cn
 *@Jan 4, 2011
 *
 */
public class PersonserviceBean implements PersonService {
	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方法");
	}
}



4、创建JKDProxyFactory.java


package cn.ehoo.aop;

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

import cn.ehoo.service.impl.PersonserviceBean;

/**
 *@author whp
 *@Email whp@ehoo.cn
 *@Jan 4, 2011
 *
 */
public class JDKProxyFactory implements InvocationHandler {
	Object targetObject;//目标对象
	public Object createProxyIntenc(Object targetObject){
		this.targetObject= targetObject;
		return Proxy.newProxyInstance(
				this.targetObject.getClass().getClassLoader(), //使用目录对象的类加载器
				this.targetObject.getClass().getInterfaces(), //得到目录对象的接口
				this);//使用完后,进行回调
		
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) 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;
	}
}


5、测试 AOPTest.java
package junit.test;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import cn.ehoo.aop.JDKProxyFactory;
import cn.ehoo.bean.Person;
import cn.ehoo.service.PersonService;
import cn.ehoo.service.impl.PersonserviceBean;

/**
 * @author whp
 * @Email whp@ehoo.cn
 * @Jan 4, 2011
 * 
 */
public class AOPTest {

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}

	/**
	 * @author whp
	 * @Email whp@ehoo.cn
	 * @Jan 4, 2011
	 * 
	 */
	@Test
	public void saveTest() {
		JDKProxyFactory factory = new JDKProxyFactory();
		PersonService bean = (PersonService) factory.createProxyIntenc(new PersonserviceBean("xxx"));
		bean.save(new Person());
	}

	@AfterClass
	public static void tearDownAfterClass() throws Exception {
	}
}



6、注意:在使用Proxy类进行代理时,目标对象一定要实现一个接口,因为在对目标对象生成代理时,要使用目录对象接口所提供的方法。而不是目录对象里的方法