十一 使用CGLIB实现AOP功能与AOP概念解释

十一 使用CGLIB实现AOP功能与AOP概念解释

前面的proxy技术必须在类实现了接口的前提下才可以实现权限的控制,cglb可以在类不实现接口的情况下完成。

在spring文件夹下lib/cglib下找到cglib的jar库文件,加入工程。

CGlibProxyFactory.java

view plaincopy to clipboardprint?
01.package cn.pf.aop;   
02.  
03.import java.lang.reflect.Method;   
04.  
05.import cn.pf.aop.service.impl.PersonServiceBean;   
06.  
07.import net.sf.cglib.proxy.Enhancer;   
08.import net.sf.cglib.proxy.MethodInterceptor;   
09.import net.sf.cglib.proxy.MethodProxy;   
10.  
11.public class CGlibProxyFactory implements MethodInterceptor{   
12.    private Object targetObject;   
13.       
14.    public Object createProxyIntance(Object targetObject){   
15.        this.targetObject = targetObject;   
16.        Enhancer enhancer = new Enhancer();   
17.        enhancer.setSuperclass(this.targetObject.getClass());   
18.        enhancer.setCallback(this);   
19.        return enhancer.create();   
20.    }   
21.  
22.    @Override  
23.    public Object intercept(Object proxy, Method method, Object[] arg2,   
24.            MethodProxy arg3) throws Throwable {   
25.        PersonServiceBean personServiceBean = (PersonServiceBean)targetObject;   
26.        Object result = null;   
27.        if(personServiceBean.getUser() != null){   
28.            result = method.invoke(targetObject, arg2);   
29.        }   
30.        return result;   
31.    }   
32.}  
package cn.pf.aop;

import java.lang.reflect.Method;

import cn.pf.aop.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());
		enhancer.setCallback(this);
		return enhancer.create();
	}

	@Override
	public Object intercept(Object proxy, Method method, Object[] arg2,
			MethodProxy arg3) throws Throwable {
		PersonServiceBean personServiceBean = (PersonServiceBean)targetObject;
		Object result = null;
		if(personServiceBean.getUser() != null){
			result = method.invoke(targetObject, arg2);
		}
		return result;
	}
}
 

AOPTest.java

view plaincopy to clipboardprint?
01.@Test public void proxyTest2(){   
02.        CGlibProxyFactory factory = new CGlibProxyFactory();   
03.        PersonServiceBean personServiceBean = (PersonServiceBean) factory.createProxyIntance(new PersonServiceBean("1"));   
04.        personServiceBean.save("111");   
05.    }  
@Test public void proxyTest2(){
		CGlibProxyFactory factory = new CGlibProxyFactory();
		PersonServiceBean personServiceBean = (PersonServiceBean) factory.createProxyIntance(new PersonServiceBean("1"));
		personServiceBean.save("111");
	} 

CGlib的enhance继承了目标类所有非final方法,对这些方法进行覆盖。创建的代理对象是目标对象的子类


完毕 end!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值