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类进行代理时,目标对象一定要实现一个接口,因为在对目标对象生成代理时,要使用目录对象接口所提供的方法。而不是目录对象里的方法
分享到:
相关推荐
在这个“java proxy demo”中,我们将深入探讨如何利用Sun JDK API来创建和使用Java动态代理。 首先,我们要了解Java代理的基本概念。Java代理分为静态代理和动态代理两种。静态代理是在编译时就已经确定代理类的...
在这个"代理demo的实现"中,我们将探讨如何在实际编程中运用代理模式。 代理通常分为静态代理和动态代理。静态代理是在编译时就已经确定了代理对象与真实对象的关系,通常通过定义接口并实现两个类(一个是真实对象...
《GoProxy-Android:全能代理服务器在安卓平台的应用与实现》 GoProxy-Android是由snail007/goproxy团队开发的一款适用于安卓系统的全能代理服务器应用。此项目旨在为移动设备提供强大的网络代理功能,使得用户能够...
总结来说,"JavaProxy Demo"是一个介绍和演示Java动态代理技术的实例,包括JDK和CGLIB两种实现方式,以及它们在实际场景中的应用。通过学习和分析这个Demo,开发者可以深入理解动态代理的概念,掌握如何在项目中利用...
通过分析这个"proxy-demo.zip",我们可以深入理解代理模式的工作原理,学习如何在实际项目中应用静态代理和动态代理,以实现更灵活、可扩展的代码结构。对于学习和提升面向对象设计能力来说,这是一个非常有价值的...
Java提供了两种实现代理模式的方式:静态代理和动态代理。 **静态代理** 静态代理是在编译时就已经确定了代理类,通过继承或实现目标接口来创建代理类。以下是一个简单的静态代理实现示例: ```java // 目标接口 ...
本篇将深入探讨如何利用Spring实现自动代理,特别是关注`BeanNameAutoProxyCreator`的使用方法。 一、Spring自动代理简介 自动代理是Spring AOP的核心功能之一,它创建了一个代理对象来包装原始的bean。当调用代理...
通过这个简单的Java动态代理demo,你可以了解到如何在实际项目中利用动态代理进行功能扩展,同时避免了为每个接口编写单独的代理类。这种技术可以极大地提高代码的可复用性和可维护性,是Java开发中一个强大的工具。
在"AOP 动态代理demo"项目中,我们可以预期看到以下几个方面的内容: 1. **代理对象的创建**:无论是JDK动态代理还是CGLIB,都需要创建代理对象。对于JDK动态代理,这通常涉及到`Proxy.newProxyInstance()`方法的...
在这个“包含静态代理和动态代理demo代码”的压缩包中,我们可能会看到两种常见的Java代理实现方式的示例:静态代理和动态代理。 首先,我们来详细讲解静态代理。在静态代理中,代理类和真实类(目标类)都是在编译...
`DynProxy.java`文件可能包含了动态代理的实现,它通常会在运行时根据接口生成代理对象,然后通过`InvocationHandler`处理方法调用。`Test.java`文件很可能是测试类,用于验证静态代理和动态代理的正确性。 静态...
动态代理和静态代理是软件设计模式中的两种重要概念,它们主要应用于对象的增强或扩展,以便在不...通过解压缩并分析“dynamic-proxy-demo”中的代码,我们可以更直观地学习和理解这两种代理模式的实现细节和应用场景。
Java JDK提供了`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口,它们是实现动态代理的关键组件。`Proxy`类用于创建代理对象,而`InvocationHandler`接口定义了一个方法,用于处理代理对象...
"proxy1demo" 提供了一个关于动态代理实现的例子,这与Java编程语言和Spring AOP(面向切面编程)框架密切相关。在这个主题中,我们将深入探讨动态代理的概念、其在Java中的实现以及Spring AOP如何利用这种机制来...
在本文中,我们将深入探讨SIP Proxy及其在SIP网络中的作用,结合"SIP_Proxy_demo"这一学习资源,为初学者提供详尽的理解。 SIP协议的核心目标是启动、修改和终止多媒体会话。它使用代理服务器来处理和路由SIP消息,...
在 Netty 中实现代理服务器,主要涉及以下几个关键组件: 1. **Bootstrap**:Netty 的启动类,用于配置服务器或客户端的连接设置。在代理服务器中,我们需要为客户端和服务器分别创建 Bootstrap 对象。 2. **...
在Java中,有两种主要的实现代理模式的方式: 1. 静态代理:静态代理是通过程序员手动创建一个代理类,这个代理类实现了与目标类相同的接口,然后在代理类的方法中调用目标类的相应方法。这种方式的优点是代码清晰...
在Java中,我们可以利用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现动态代理。 ```java import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; ...
在这个“代理模式Demo”中,我们将深入探讨代理模式的概念、作用以及如何通过代码实现。 1. **代理模式的基本概念** 代理模式属于结构型设计模式,它创建了一个代理对象来控制对原对象的访问。代理对象与目标对象...
在Java中,JDK提供了一个`java.lang.reflect.Proxy`类和一个`java.lang.reflect.InvocationHandler`接口,它们是实现动态代理的关键。Proxy类用于创建代理对象,而InvocationHandler接口定义了处理方法调用的逻辑。 ...