JDK与CGlib实现aop代理简单实例:
1 PersonService.java
2 PersonBean
JDKProxyFactory.java
1 PersonService.java
/*
*@Author swxctx
*@time 2016年9月21日
*/
package com.sw.service;
public interface PersonService{
public void save(String name);
public void update(String name,Integer personid);
public String getPersonName(Integer personid);
}
2 PersonBean
/*
*@Author swxctx
*@time 2016年9月21日
*/
package com.sw.serv.impl;
import com.sw.service.PersonService;
public class PersonBean implements PersonService {
private String user=null;
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public PersonBean(){
}
public PersonBean(String user){
this.user=user;
}
@Override
public void save(String name) {
// TODO Auto-generated method stub
System.out.println("save-method");
}
@Override
public void update(String name, Integer personid) {
// TODO Auto-generated method stub
System.out.println("update-method");
}
@Override
public String getPersonName(Integer personid) {
// TODO Auto-generated method stub
System.out.println("getPersonName");
return "xxx";
}
}
3 使用JDK代理
JDKProxyFactory.java
/*
*@Author swxctx
*@time 2016年9月21日
*/
package com.sw.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.sw.serv.impl.PersonBean;
public class JDKProxyFactory implements InvocationHandler {
//JDK动态代理
private Object targetObject;
//创建一个代理对象
public Object createProxyIntance(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 {
// TODO Auto-generated method stub
PersonBean bean=(PersonBean)this.targetObject;
Object result=null;
if(bean.getUser()!=null){
//...advice-->前置通知
try {
result = method.invoke(targetObject, args);//代理对象将方法委派给目标对象
//afteradvice-->后置通知
} catch(RuntimeException e) {
// TODO: handle finally clause
//exceptionadvice-->例外通知
}finally{
//finaladvice-->最后通知
}
}
return result;
}
}
4 使用CGlib代理
CGlibProxyFactory.java
/*
*@Author swxctx
*@time 2016年9月22日
*/
package com.sw.aop;
import java.lang.reflect.Method;
import com.sw.serv.impl.PersonBean;
import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CGlibProxyFactory implements MethodInterceptor{
//使用cglib产生代理对象
private Object targetObject;
//创建代理
public Object createProxyIntance(Object targetObject){
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer();//创建对象
enhancer.setSuperclass(this.targetObject.getClass());//指定父类,会覆盖所有非final的方法
enhancer.setCallback((Callback) this);//设置回调
return enhancer.create();//创建代理对象
}
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodproxy) throws Throwable {
// TODO Auto-generated method stub
PersonBean bean=(PersonBean)this.targetObject;
Object result=null;
if(bean.getUser()!=null){
result = methodproxy.invoke(targetObject, args);//代理对象将方法委派给目标对象
}
return result;
}
}
5 进行单元测试
/*
*@Author swxctx
*@time 2016年9月21日
*/
package com.sw.junit.test;
import static org.junit.Assert.*;
import org.junit.BeforeClass;
import org.junit.Test;
import com.sw.aop.CGlibProxyFactory;
import com.sw.aop.JDKProxyFactory;
import com.sw.serv.impl.PersonBean;
import com.sw.service.PersonService;
public class AOPtest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@Test
public void test() {
JDKProxyFactory factory=new JDKProxyFactory();
PersonService service = (PersonService)factory.createProxyIntance(new PersonBean("xc"));//创建一个代理
service.save("0707");
}
@Test
public void test2() {
CGlibProxyFactory factory=new CGlibProxyFactory();
PersonBean service = (PersonBean)factory.createProxyIntance(new PersonBean("xc"));//创建一个代理
service.save("0808");
}
}