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类进行代理时,目标对象一定要实现一个接口,因为在对目标对象生成代理时,要使用目录对象接口所提供的方法。而不是目录对象里的方法
分享到:
相关推荐
用sun的JDK API实现java的动态代理类
对通过该功能的实现,简单明了得阐述了代理的相关用法以及语法特征,适合新手观看
Java动态代理的Demo,讲述动态代理的实现与用途。
设计模式中的动态代理实现,和springAop理解实现;
android动态代理实现事件注入Demo
java 代理模式demo ,主要就是对代理模式的一种实现过程,用于刚接触代理模式的人使用,里面介绍了两种代理模式,一种是静态代理,另一种是动态代理的实现Demo
静态代理和动态代理简单实现代码.Proxy.其中静态代理我写了两个demo,有一个是最原始的,还有一个放在程杰的大化设计模式的代理模式写的,纯属娱乐。
代理优点有:隐藏委托类的实现解耦,不改变委托类代码的情况下做一些额外处理,比如添加初始判断及其他公共操作根据程序运行前代理类是否已经存在,可以将代理分为静态代理和动态代理。###1.2静态代理代理类在程序...
使用jdk proxy代理接口方式实现 使用Cglib代理类方式实现 自己实现的动态代理 模仿jdk proxy自己实现动态代理: 核心:实现动态代理的Proxy类 , 实现动态代理的InvocationHandler类重写invoke方法实现. 二.spring 1...
代理模式的小demo
3. 运行:Demo.java 右键,Run Demo.main() ## 使用简介 ### 初始化 ```java ImageClient imageClient = new ImageClient(APPID, SecretId, SecretKey); ``` ### 设置代理 根据实际网络环境,可能要设置代理,...
proxy-istio-demo 该项目主要是模拟 从应用程序容器到Sidecar代理的流量 基本的实现原理 测试 $ curl localhost:8080 -vv -w "\n timeout ---> %{time_total} \n" * Trying ::1... * TCP_NODELAY set * Connected...
Python中的代理重新加密演示这是Proxy Re-Encryption(PRE)的演示,演示了如何将其与对称加密正确结合使用,以实现用户数据隐私的极高安全性。 在这种情况下,使用流密码CHACHA20和块密码AES来确保代理(服务器)...
提供了现成的随机去除一个有效代理IP的方法,并附送一个demo,自动提取一个有效IP并使用这个IP访问网站。 源码采用简单三层架构: Model:模型层,主要放了一个tb_proxy模型,包含代理ip的IP、端口、有效性、...
JAVA调用C#的动态库时,由于无法直接调用,需要通过代理的方式进行转掉,此处提供C#实现代理服务的转掉DEMO。
厂里上个网需要设置代理服务器,切换各种环境『包括但不仅限于开发环境、QA、预上线、验收、生产环境、压力测试、Demo……』都需要给浏览器设置不同的代理服务器。 虽然俺有神器Firefox+Change Host+HostAdmin+Proxy...
一个用 + 和写代理有多简单的demo,主要针对。 整个项目由三个 Java 源文件组成。 使用完全异步的 I/O 为 GET 请求实现一个简单的 HTTP 代理,对已经看到的响应使用非常简单的缓存(这是一个演示!)。 建造 只需...
静态代理就是在程序运行之前,代理类字节码.class就已编译好,通常一个静态代理类也只代理一个目标类,代理类和目标类都实现相同的接口。 接下来就先通过 demo 进行分析什么是静态代理,当前创建一个 Animal 接口,...
新建test14来实现一个简单的代理Demo: 复制代码 代码如下: import urllib2 enable_proxy = True proxy_handler = urllib2.ProxyHandler({“http” : ‘http://some-proxy.com:8080’}) null_proxy_
此外, 用作反向代理。 NGINX auth_request指令确保使用OpenID Connect对所有对Opencast的请求进行身份验证。 由keycloak发出的ID令牌的处理在security-jwt模块中实现。 建筑 使用附加的security-jwt模块下载并构建...