架构探险(第四天)

架构探险(第四天)

主要功能

  • 代理
  • aop
  • 事务

其中代理是技术基础,aop是技术,事务则是基于aop实现的一项功能

静态代理

简单说,代理就是不主动去做,而是委托别人去做。静态代理可以看得很清楚,HelloProxyHello类对象作为一个属性,然后在sayHello方法中调用Hello类对象的sayHello方法,进而实现自己想要的功能。

    class HelloProxy{
        Hello hello;
        public void sayHello(String name){
            hello.sayHello(name);
        }
    }

不过静态代理实在是太low了,如果有一万个Hello这样的功能,岂不是要写两万个类,这可不是我们这群懒人应该做的事。所以,这时候就应该想到,是不是有什么办法可以自动生成代理类。

动态代理

  • JDK动态代理
  • CGlib动态代理

两种动态代理这里就不细说了,各有优势,spring也是在不同情况下区别使用。

有了动态代理,我们就不用那么麻烦的手动一个个的写代理类了,于是我们就实现了更牛叉的功能。

aop

代理的好处是,你可以选择在什么时候调用你想要调用的那个方法,有点绕口哦,看下代码:

    public final Object doProxy(ProxyChain proxyChain) throws Throwable {
        Object result = null;

        Class<?> cls = proxyChain.getTargetClass();
        Method method = proxyChain.getTargetMethod();
        Object[] params = proxyChain.getMethodParams();

        begin();
        try {
            if (intercept(cls, method, params)) {
                before(cls, method, params);
                result = proxyChain.doProxyChain();//此处调用被代理的那个方法
                after(cls, method, params, result);
            }
        } catch (Exception e) {
            logger.error("代理失败", e);
            error(cls, method, params, e);
        } finally {
            end();
        }
        return result;
    }

看代码就很清楚了,在你想调用的那个方法前后,你可以做很多事情,从beginend,可以加条件中断方法执行,可以捕获异常。。。

这就是aop的魅力,不侵入你原有的代码,却能实实在在的做很多事情,这是借助动态代理实现的,现在是不是觉得动态代理特别的优美。

事务

不知道你有没有想过,为什么 spring 就那么加个注解,就能实现事务控制,你是不是也疑惑了好久。

现在你知道了,是因为在加了事务注解的方法上,spring 会自动给这些方法加上事务特有的切面,事前开启事务,时候提交事务,出错回滚。很简单的道理,以前却一直是模模糊糊、不甚明了。

还有个小 tip,那就是如果你在自己写的切面里面,做一些修改数据源操作,如果此时你切入的方法上有事务注解,那么修改数据源的操作是不会生效的。为什么?因为你自己的切面是在事务的切面里面,在你修改之前事务已经开启,此时的修改是无用的。

举个例子:

    @Aspect
    @Transaction
    public void delete(long id){
        service.delete(id);
    }

如果你切入这个方法,在切面里面修改数据源,那么修改操作是不会生效的。其实稍微修改一下就没问题,你想到没有:

    @Transaction
    public void deleteWithTransaction(long id){
        service.delete(id);
    }
    @Aspect
    public void delete(long id){
        deleteWithTransaction(id);
    }

就是这样,尽量不要让他们一起出现,除非你不做修改数据源等类似操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值