AOP_使用CGLIB实现AOP功能

本文介绍如何使用CGLIB库实现代理模式,通过创建目标对象的子类来拦截并增强业务层方法,实现AOP功能。示例中演示了如何通过CGLIB拦截PersonServiceImp类的所有方法,并在调用前进行权限检查。
摘要由CSDN通过智能技术生成

好处:不需要目标对象实现接口

使用的架包:cglib-nodep-2.1_3.jar

实例:使用CGLIB实现AOP功能

         拦截所以业务层方法,模拟用户验证(用户为null,即没用权限)

PersonServiceImp.java

/**
 * 业务层,被拦截对象
 */
package com.qh.service.imp;
public class PersonServiceImp {
	String user = null;//用户
	// 获得用户信息的方法
	public String getUser() {
		return user;
	}

	public PersonServiceImp() {
	}

	public PersonServiceImp(String user) {
		this.user = user;
	}

	public void save(String name) {
		System.out.println("我是save()方法"+name);
	}

	public void update(String name, int id) {
		System.out.println("我是update()方法");
	}

	public String getPersonName(int id) {
		return "我是getPersonName()方法";
	}

}

 CGlibProxyFactory.java

package com.qh.aop;

import java.lang.reflect.Method;

import com.qh.service.imp.PersonServiceImp;

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();
		/*
		 * 设置其父类,即目标类;这时他会产生一个目标类的子类,
		 * 该子类可以覆盖父类中所有非final的方法,并添加一些自身的代码
		 */
		enhancer.setSuperclass(this.targetObject.getClass());
		//设置回调,并需要实现MethodInterceptor接口,回调intercept()方法
		enhancer.setCallback(this);
		return enhancer.create();//返回一个代理对象
	}
	//接口中的方法
	//参数说明:代理对象本身、被拦截到的方法、方法的输入参数、方法的代理对象
	public Object intercept(Object proxy, Method method, Object[] args,
			MethodProxy methodProxy) throws Throwable {
		PersonServiceImp personServiceImp=(PersonServiceImp)this.targetObject;
		Object result=null;
		if(personServiceImp.getUser()!=null){
			result=methodProxy.invoke(this.targetObject, args);
		}
		return result;
	}
}

 AOPTest.java

package com.qh.test;
import org.junit.Test;
import com.qh.aop.CGlibProxyFactory;
import com.qh.service.imp.PersonServiceImp;

public class AOPTest {

	@Test
	public void test() {
		CGlibProxyFactory cGlibProxyFactory = new CGlibProxyFactory();
		//cGlibProxyFactory创建的类是PersonServiceImp的子类
		PersonServiceImp imp = (PersonServiceImp) cGlibProxyFactory
				.createProxyIntance(new PersonServiceImp("xh"));
		imp.save("熊晖");
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值