Proxy实现代理demo
save、update、insert方法,只有在用户登录后才能对这些方法进行访问,如果没有登录则不允许对用户进行访问。
对于这个问题,我们不能在每个方法里对user进行判断,这样做不但增加程序重复代码的数量,还影响代码的美观
所以我们可以使用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;}}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);}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方法");}}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);//使用完后,进行回调}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {PersonserviceBean bean = (PersonserviceBean) targetObject;//因为在程序里targetObject为PersonServiceBeanObject result=null;if(bean.getUser()!=null)//判断user是否为空result= method.invoke(targetObject, args);//如果不为空交给目标对象进行处理.// TODO Auto-generated method stubreturn result;}}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 {@BeforeClasspublic static void setUpBeforeClass() throws Exception {}/** * @author whp * @Email whp@ehoo.cn * @Jan 4, 2011 * */@Testpublic void saveTest() {JDKProxyFactory factory = new JDKProxyFactory();PersonService bean = (PersonService) factory.createProxyIntenc(new PersonserviceBean("xxx"));bean.save(new Person());}@AfterClasspublic static void tearDownAfterClass() throws Exception {}}