好处:不需要目标对象实现接口
使用的架包: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("熊晖");
}
}