Proxy兑现代理demo
Proxy实现代理demo
save、update、insert方法,只有在用户登录后才能对这些方法进行访问,如果没有登录则不允许对用户进行访问。
对于这个问题,我们不能在每个方法里对user进行判断,这样做不但增加程序重复代码的数量,还影响代码的美观
所以我们可以使用jdk为我们提供的Proyx来实现目录类,这样就会产生一个动态代理,在这个动态代理类里对user进行判断,如果user不为空,就把方法的调用接给目标类进行执行。
1、用户建一个java项目AOP。
2、在项目中创建程的Person.java
2、创建PersonService.java与PersonServiceBean.java
PersonService.java
PersonServiceBean.java
4、创建JKDProxyFactory.java
5、测试 AOPTest.java
6、注意:在使用Proxy类进行代理时,目标对象一定要实现一个接口,因为在对目标对象生成代理时,要使用目录对象接口所提供的方法。而不是目录对象里的方法
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; } }
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类进行代理时,目标对象一定要实现一个接口,因为在对目标对象生成代理时,要使用目录对象接口所提供的方法。而不是目录对象里的方法