CGLIB和JDK代理

需要的架包:在spring中提供对CGLIB的支持

  CGLIB和JDK代理

一、JDK的动态代理

  1.接口IUserDao

 package cn.itcast.spring3.jdk.proxy;

 public interface IUserDao {

     public void add();
public void update(); }

  2.接口的实现类UserDaoImpl.java

 package cn.itcast.spring3.jdk.proxy;

 public class UserDaoImpl implements IUserDao {

     @Override
public void add() {
System.out.println("add......"); } @Override
public void update() {
System.out.println("update........."); } }

  3.JDKProxy.java

 package cn.itcast.spring3.jdk.proxy;

 import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; /**
* jdk动态代理 这个是必须有接口和实现类
* 使用动态代理增强指定方法
* @author Administrator
*
*/
public class JDKProxy implements InvocationHandler { private IUserDao userDao;
public JDKProxy(IUserDao userDao) {
super();
this.userDao = userDao;
} public IUserDao createProxy(){
IUserDao proxy = (IUserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),
userDao.getClass().getInterfaces(), this);
return proxy;
} /**
* 所有的方法都要经过这个方法过滤
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if("add".equals(method.getName())){
System.out.println("日志的记录");
Object result = method.invoke(userDao, args);
return result;
}
return method.invoke(userDao, args);
} }

  4.测试类:TestJdkProxy.java

 package cn.itcast.spring3.jdk.proxy;

 import org.junit.Test;

 public class TestJDKProxy {

     @Test
public void jdkProxyText(){
//创建真是对象
IUserDao userDao = new UserDaoImpl();
//创建一个代理对象
IUserDao proxy = new JDKProxy(userDao).createProxy();
proxy.add();
proxy.update();
} }

二、CGLIB的代理

  1.UserDao.java

 package cn.itcast.spring3.cglib.proxy;

 public class UserDao {

     public void add(){
System.out.println("add........");
} public void update(){
System.out.println("update");
} }

  2.CGLIBProxy.java

 package cn.itcast.spring3.cglib.proxy;

 import java.lang.reflect.Method;

 import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import org.springframework.util.ReflectionUtils.MethodCallback; /**
* 通过指定子类来实现代理
* 即任何一个类都可以代理
*
* @author Administrator
*
*/
public class CGLIBProxy implements MethodInterceptor { //你要代理的父类
private UserDao userDao; public CGLIBProxy(UserDao userDao) {
super();
this.userDao = userDao;
} //创建代理
public UserDao createProxy(){
/*
* 使用CGLIB生成代理
*/
//1.创建核心类 enhancer:增强
Enhancer enhancer = new Enhancer();
//2.为其设置父类
enhancer.setSuperclass(userDao.getClass());
//3.设置回调
enhancer.setCallback(this);
//4.创建代理
return (UserDao)enhancer.create(); } /**
* 对add方法进行增强
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
if("add".equals(method.getName())){
System.out.println("写入日志");
Object result = methodProxy.invokeSuper(proxy, args);
return result;
}
return methodProxy.invokeSuper(proxy, args);
} }

  3.TestCGLIBProxy.java

 package cn.itcast.spring3.cglib.proxy;

 import org.junit.Test;

 public class TestCGLIBProxy {

     @Test
public void CGLIBProxyTest(){
UserDao proxy = new CGLIBProxy(new UserDao()).createProxy();
proxy.add();
proxy.update();
} }

三、JDK的动态代理必须有接口,而CGLIB的代理,则不需要接口,即任何一个类都可以生成代理

上一篇:浅谈DevExpress<二>:设计一个完整界面(2)


下一篇:C图形库Easyx的使用