首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Proxy兑现代理demo

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

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;}}


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);//使用完后,进行回调}@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;}}


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 {@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 {}}



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

热点排行