java代理demo

需求:使用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

群号:552113611

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 参考资料:菜鸟教程之设计模式 设计模式概述 设计模式(Design pattern)代表了最佳的实践,通常被有经验...
    Steven1997阅读 1,199评论 1 12
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,351评论 11 349
  • 教友虔诚唱赞歌,圣堂情景最柔和。 阳澄湖畔平安夜,明日春归梦里多。
    黄叶村人阅读 214评论 0 3
  • 她的文字象一串串精致小巧古铜质地的钥匙,冬日的斜阳下,缓缓地在你面前打开尘封的抽屉。 时光微尘中的活色生香、恩怨情...
    浅岛繁花2017阅读 853评论 4 4
  • 《白蛇传》的故事极早以口头相传为主,基本故事梗概、前情后事在南宋就已经具备了,最早的成型故事记载于冯梦龙的《警世通...
    十言九不语阅读 411评论 0 0