继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

java代理demo

MMTTMM
关注TA
已关注
手记 303
粉丝 65
获赞 364

需求:使用AOP方式打印日志

用户service层,接口与实现类

public interface IUserService {    void addUser(String name);
}public class UserService implements IUserService{    @Override
    public void addUser(String name) {
        System.out.println("将"+name+"添加到数据库");
    }
    
}

1.静态代理

静态代理,使用一个代理类,需要实现服务的接口,来代理用户的动作,并添加一些另外的东西

public class StaticProxy implements IUserService{    private IUserService userservice = new UserService();    
    @Override
    public void addUser(String name) {
        
        userservice.addUser(name);
        System.out.println("我是日志:添加了"+name);
        
    }
    
}

效果如下


image.png

2.动态代理

jdk动态代理

jdk动态代理有个前提,就是被代理的类必须要实现接口

还是上面的两个

public class JDKProxy implements InvocationHandler{    private Object object;    
    public Object createProxyInstance(Object object) {        this.object = object;        return Proxy.newProxyInstance(object.getClass().getClassLoader()
                , object.getClass().getInterfaces(), this);
    }    
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        //执行额外的逻辑
        System.out.println("我是日志,前置处理");        //执行原来的逻辑
        Object invoke = method.invoke(object,args);        return invoke;
    }
    
}

测试用例

@Test
    public void testJdkProxy() {
        
        IUserService userService = new UserService();
        
        JDKProxy jdkProxy = new JDKProxy();
        IUserService createProxyInstance = (IUserService)jdkProxy.createProxyInstance(userService);
        createProxyInstance.addUser("李四");
        
    }

效果如下

image.png

cglib动态代理

因为jdk代理需要被代理类实现接口,没必要为每个类都实现接口,所以就出现了cglib

public class Admin {

    public void addAdmin(String name) {
        System.out.println("添加了"+name);
    }
    
}

cglib代理类

public class CglibProxy implements MethodInterceptor{    private Enhancer enhancer = new Enhancer();    
    public Object getProxyInstance(Class clazz){
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);        return enhancer.create();
    }    
    
    
    @Override
    public Object intercept(Object object, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("我是日志:是前置处理");        //通过代理子类来调用父类的方法
        Object invoke = proxy.invokeSuper(object, args);
        System.out.println(args.toString());        return invoke;
    }
    
}

测试用例

@Test
    public void testCglibProxy() {
        CglibProxy cglibProxy = new CglibProxy();
        IUserService proxyInstance = (IUserService)cglibProxy.getProxyInstance(UserService.class);
        proxyInstance.addUser("王五");
        
    }

效果如下

image.png

代码请到码云下载:https://gitee.com/zhangqiye/java-proxy



作者:z七夜
链接:https://www.jianshu.com/p/db860f0391a9

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP