集群存储新闻业界动态:大数据冲击存储市场 集群存储空间将扩大
2012-03-04 23:39
316 查看
这里我们就需要用到cglib-nodep-2.1_3.jar这个包
下面代码是演示的是一个用户权限判断,并赋予这个用户相应的操作。这里我做的是这样的用户权限设置:只要用户名不为空,那么就赋予它操作目标类中的所有方法的权利
代码一:
代码二 CGlibProxyFactory.java和JDKProxyFactory.java
代码三:personServiceBean.java和personServiceBean2.java
测试类:AOPTest.java
学习总结:
1:JDKProxy拦截是,通过新建一个Proxy对象来实现的,里面传入三个参数,一个目标类的类加载器,一个目标类实现了的接口,一个目标类对象Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader() , this.targetObject.getClass().getInterfaces(), this);
2:CGlib是通过定义Enhancer类的对象,然后覆盖目标类的非final方法实现的集成,在通过回调
3:如果是用JDKProxy实现拦截,那么目标类必须是面向接口编程。而CGlib则不需要
下面代码是演示的是一个用户权限判断,并赋予这个用户相应的操作。这里我做的是这样的用户权限设置:只要用户名不为空,那么就赋予它操作目标类中的所有方法的权利
代码一:
package cn.itcast.service; public interface IPersonService { public void save(String name); }
代码二 CGlibProxyFactory.java和JDKProxyFactory.java
package cn.itcast.service.aop; import java.lang.reflect.Method; import cn.itcast.service.impl.personServiceBean; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class CGlibProxyFactory implements MethodInterceptor{ private Object targetObject; public Object createProxyIntance(Object targetObject){ this.targetObject = targetObject; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.targetObject.getClass());//CGlib是集成目标类,然后覆盖目标类中的非final方法,这样达到代理的效果 enhancer.setCallback(this); return enhancer.create(); } public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { personServiceBean bean =(personServiceBean) this.targetObject; Object result = null; if(bean.getUser()!=null){ //advice -->AOP术语:前置通知 try { result = methodProxy.invoke(targetObject, args); //afteradvice-->AOP术语:后置通知 } catch (Exception e) { //Exceptionadvice-->AOP术语:例外通知 }finally{ //finallyadvice-->AOP术语:最终通知 } } return result; } }
package cn.itcast.service.aop; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import cn.itcast.service.impl.personServiceBean2; public class JDKProxyFactory implements InvocationHandler{ private Object targetObject; public Object createProxyIntance(Object targetObject){ this.targetObject =targetObject; return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader() , this.targetObject.getClass().getInterfaces(), this); } public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable { personServiceBean2 bean =(personServiceBean2) this.targetObject; Object result = null; if(bean.getUser()!=null){ result = arg1.invoke(targetObject, arg2); } return result; } }
代码三:personServiceBean.java和personServiceBean2.java
package cn.itcast.service.impl; import cn.itcast.service.IPersonService; public class personServiceBean { private String user ; public String getUser() { return user; } public personServiceBean() { } public personServiceBean(String user) { this.user = user; } public String getPersonName(Integer personId) { return "postino"; } public void save(String name) { System.out.println("这是save方法"); } }
package cn.itcast.service.impl; import cn.itcast.service.IPersonService; public class personServiceBean2 implements IPersonService { private String user ; public String getUser() { return user; } public personServiceBean2() { } public personServiceBean2(String user) { this.user = user; } public String getPersonName(Integer personId) { return "postino"; } public void save(String name) { System.out.println("这是save方法"); } public void update(String name, Integer personId) { System.out.println("这是update方法"); } }
测试类:AOPTest.java
package junit.test; import static org.junit.Assert.*; import org.junit.BeforeClass; import org.junit.Test; import cn.itcast.service.aop.CGlibProxyFactory; import cn.itcast.service.aop.JDKProxyFactory; import cn.itcast.service.impl.personServiceBean; import cn.itcast.service.impl.personServiceBean2; import cn.itcast.service.IPersonService; public class AOPTest { @BeforeClass public static void setUpBeforeClass() throws Exception { } @Test public void proxyTest(){ JDKProxyFactory jdkpf = new JDKProxyFactory(); IPersonService ipersonService = (IPersonService)jdkpf.createProxyIntance(new personServiceBean2("")); ipersonService.save(""); } @Test public void proxyTest2(){ CGlibProxyFactory jdkpf = new CGlibProxyFactory(); personServiceBean service = (personServiceBean)jdkpf.createProxyIntance(new personServiceBean("")); service.save(""); } }
学习总结:
1:JDKProxy拦截是,通过新建一个Proxy对象来实现的,里面传入三个参数,一个目标类的类加载器,一个目标类实现了的接口,一个目标类对象Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader() , this.targetObject.getClass().getInterfaces(), this);
2:CGlib是通过定义Enhancer类的对象,然后覆盖目标类的非final方法实现的集成,在通过回调
3:如果是用JDKProxy实现拦截,那么目标类必须是面向接口编程。而CGlib则不需要
相关文章推荐
- mongodb集群环境存储空间矢量数据(1)
- 【每日新闻】孟天广:可利用大数据监测政商腐败,查出“白手套” | IDC:2017年第四季度全球企业存储市场增长13.7%
- 【转】c++各种数据类型所占存储空间大小
- 表数据和索引数据分开独立表空间存储优点
- SQL Servr 2008空间数据应用系列八:基于Bing Maps(Silverlight)的空间数据存储 推荐
- 程序的局部变量 全局变量 动态申请数据分别存储在什么地方
- C/C++基本数据类型的存储空间长度及取值范围
- 《Oracle编程艺术》学习笔记(9)-Oracle中的文件-数据文件和存储体系(表空间/段/区段/块)
- 建立一个存储和处理字符串的类DelCharStr。构造函数:动态申请存储字符串所需内存空间,并且即能用指定的字符串也能用默认的值0为所声明的对象进行初始化。
- 存储动态数据时,数据库的设计方法
- 用html、jquery、php编写新闻后台管理页面,动态添加新闻数据并实现数据的增删改查功能
- Vector容器实现未知大小的数组动态存储数据
- [转载]存储空间动态分配
- Android实现动态切换横竖屏,保存横竖屏数据(用Preference存储)
- Centos7.3,mysql5.7环境,数据存储空间加大调整方案。
- 设某计算机的逻辑地址空间和物理地址空间均为128KB,按字节编址。若某进程最多需要6页数据存储空间,页面大小为1KB,操作系统采用固定分配局部置换策略为该进程分配4个页框(物理块)。
- MySQL存储过程动态创建表,数据分表
- 检查存储结构-控制、REDO日志、表空间使用情况、数据文件等信息脚本--HTML
- [原创]空间换速度,c实现自连接Hashtable实现高性能数据存储