Spring 的AOP详解

1.什么是AOP、有什么用

AOP(Aspect Orient Programming)面向切面编程,简单来说,就是一个特殊配置的拦截器,可以拦截某一类、某一路径的类中方法,在方法前、后、或者异常时进行统一处理。拦截器的配置,不用入侵代码, 可以用于统一的旁路处理,比如日志、异常处理、入参出参检查等。

但是因为不用入侵代码,所以有时在代码逻辑上会令人觉得疑惑。

2.AOP怎么用

根据spring的配置特性,可以使用xml配置或者注解配置.详细的可以参考最详细、最全面的AOP注解配置

  a)xml的配置,主要配置两个点:1.在哪些方法上做切面;2.做什么类型的切面

<bean id="broker" class="aspect.Broker"/>//拦截器本身

<!-- 配置AOP -->
<aop:config>
    <!-- where:拦截哪些方法在哪些地方(包.类.方法) -->
    <aop:pointcut id="landlordPoint"
                  expression="execution(* pojo.Landlord.service())"/>//可以适配一类方法
    <aop:aspect id="logAspect" ref="broker">
        <!-- when:在什么时机(方法前/后/前后) -->
        <aop:around pointcut-ref="landlordPoint" method="around"/>
    </aop:aspect>
</aop:config>

b).注解配置

@ASPECTJ
public class interceptor(){
    @Before(value="excution(*.a.b)")
    public void test(JointCut a,Object returnType,Throwable exception){
        //在方法执行以前进行操作
    }

}

这里需要注意 允许使用切面注解。

    <aop:aspectj-autoproxy/>

3.Spring的Aop 重构 简单的AOP重构可以参考【Spring】重构--仿写Spring核心逻辑(五)实现AOP(aop包)​​​​​​​z

AOP的代码逻辑比较简单:可以从几个方面去分析:

1.什么时候解析的AOP:spring在ApplicationContext 加载bean的时候,就会判断该类是否有AOP的注解或者XML配置。如果有,缓存对象会变成代理类

2.怎么解析AOP;

AOP中比较重要的类是AdvisedSupport,会缓存所有的Advised,每一个bean被解析时,都会被分析是否满足 模板表达式,如果是,就构造出 interceptor链,

具体代码在 DefaultAdvisorChainFactory.getInterceptorAndDynamicInterceptionAdvice(Advised,Method,targetCalss)

3.AOP的执行入口是什么;

AOP代码的执行入口是在代理类的invoke中,由于spring 缓存bean时,是使用Proxy,当执行该bean时,调用的是Proxy中的invoke中代码。例如JdkDynamicAopProxy中。

对于不同的调用方式Before\After\Return\throwing等, 调用的不同的Matcher。

4.执行的链逻辑是什么

在 代理中会缓存interceptor链,链的执行逻辑比较简单。

不同的调用方式Before\After\Return\throwing等, 有不同的Matcher。对于Matcher,调用各类自行implement的方法

5.QA

a)什么是代理

代理从代码上来看,就是简单的一行代码

Proxy.newProxyInstance(classLoader,interfaces,invocationHandler)

在我理解上来看,所谓代理就是,让编译器帮你完成implement的类,而不是自己定义一个implement。这么说来,和lamda有点像。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值