spring框架基础02

关于静态代理与动态代理

静态代理设计模式特点:

优点: 结构清晰 易于理解

缺点: 如果被代理者有多个方法,则代理者也需要开发多个方法,其中存在

大量重复的代码,仍然存在代码重复的问题

静态代理设计模式解决了软件分层过程中而额外的功能代码侵入模块的问题,

将额外的功能代码提取到了代理者中进行,但是静态代理事项的代理者中存在

大量的重复的代码,所以真正开发中–包括spring的底层,基本不会使用静态代理

关于动态代理

jdk内置的动态代理–java.lang.reflect Proxy类

java动态代理的特点

优点:不需要下个静态代理一样,被代理方法都必须是新以便,而只需要在

回调函数中进行处理即可,重复代码只写一次。

缺点:Java的动态代理是通过代理者实现和被代理者相同的接口,从而保证

两者具有相同的方法,如果被代理者的想要被代理的方法不属于任何接口,

则生成的代理者无法实现对该方法的代理。

所有java的动态代理机制是基于接口进行的,受制于要被代理的方法是否优接口的支持

动态代理–第三方包CGLIB实现的动态代理

CGLIB是第三方提供的动态代理实现工具,不管有没有接口都可以实现动态代理。

CGLIB实现动态代理的原理是,生成的动态代理是被代理者的子类,所以代理者

具有和父类(被代理者)相同的方法,从而实现代理。

SpringAOP详解

Spring aop中的基本概念

连接点(joinpoint):在程序执行的过程中某个特定的点,比如某方法调用或者处理异常的时候

在Spring AOP 中,一个连接点总是表示着一个方法的执行。

层与层之间调用的过程中,目标层可供调用的方法,称之为连接点

切入点(PointCut):匹配连接点的断言,通知和一个切入点表达式关联,并在

满足这个切入点的连接点上运行,例如执行某个特定名称的方法时。切入点表达式

和连接点如何与连接是AOP的核心:Spring缺省使用AspectJ切入点语法。

在连接点的基础上,增加切入点规则,选择出需要进行增强的连接点,这些基于

切入点规则选出来的连接点,称之为切入点。

切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。

事务管理是J2EE应用中一个关于横切关注点的很好的例子。在Spring AOP中,

切面可以使用基于模式)或者基于@Aspect注解的方式来实现。

狭义上就是 当spring拦截下切入点后 将这些切入点
交给 处理类 进行功能的增强,这个处理类就称之为切面。
广义上来讲 将spring底层的代理 切入点 和 处理类 加在一起
实现的 对层与层之间调用过程进行增强的机制 称之为切面。
就是真正希望被访问到的对象。spring底层的动态代理对他进行了代理,

具体能不能真的访问到目标对象,或在目标对象真正执行之前和之后是否做一些额外的操作,取决于切面。

  1. Spring的五大通知类型
    a. 前置通知
    在目标方法执行之前执行执行的通知
    前置通知方法,可以没有参数,也可以额外接收一个JoinPoint,Spring会自动将该对象传入,代表当前的连接点,通过该对象可以获取目标对象 和 目标方法相关的信息。
    注意,如果接收JoinPoint,必须保证其为方法的第一个参数,否则报错。

    b. 环绕通知
    在目标方法执行之前和之后都可以执行额外代码的通知。
    在环绕通知中必须显式的调用目标方法,否则目标方法不会执行。
    这个显式调用时通过ProceedingJoinPoint来实现的,可以在环绕通知中接收一个此类型的形参,spring容器会自动将该对象传入,这个参数必须处在环绕通知的第一个形参位置。
    **要注意,只有环绕通知可以接收ProceedingJoinPoint,而其他通知只能接收JoinPoint。

    环绕通知需要返回返回值,否则真正调用者将拿不到返回值,只能得到一个null。
    环绕通知有
    控制目标方法是否执行
    目标方法执行之前或之后执行额外代码
    控制是否返回返回值
    改变返回值
    的能力
    环绕通知虽然有这样的能力,但一定要慎用,要小心不要破坏了软件分层的“高内聚 低耦合”的目标。

c. 后置通知
在目标方法执行之后执行的通知。
在后置通知中也可以选择性的接收一个JoinPoint来获取连接点的额外信息,但是这个参数必须处在参数列表的第一个。

在后置通知中,还可以通过配置获取返回值

一定要保证JoinPoint处在参数列表的第一位,否则抛异常

d. 异常通知
在目标方法抛出异常时执行的通知

可以配置传入JoinPoint获取目标对象和目标方法相关信息,但必须处在参数列表第一位
另外,还可以配置参数,让异常通知可以接收到目标方法抛出的异常对象

e. 最终通知
是在目标方法执行之后执行的通知。和后置通知不同之处在于,后置通知是在方法正常返回后执行的通知,如果方法没有正常返-例如抛出异常,则后置通知不会执行。而最终通知无论如何都会在目标方法调用过后执行,即使目标方法没有正常的执行完成。另外,后置通知可以通过配置得到返回值,而最终通知无法得到。
配置方式:

最终通知也可以额外接收一个JoinPoint参数,来获取目标对象和目标方法相关信息,但一定要保证必须是第一个参数。

f. 五种通知执行的顺序
i. 在目标方法没有抛出异常的情况下
前置通知
环绕通知的调用目标方法之前的代码//取决于配置顺序
目标方法
环绕通知的调用目标方法之后的代码
后置通知//取决于配置顺序
最终通知
ii. 在目标方法抛出异常的情况下:
前置通知
环绕通知的调用目标方法之前的代码//取决于配置顺序
目标方法 抛出异常
异常通知
最终通知
iii. 如果存在多个切面:
多切面执行时,采用了责任链设计模式。
切面的配置顺序决定了切面的执行顺序,多个切面执行的过程,类似于方法调用的过程,在环绕通知的proceed()执行时,去执行下一个切面或如果没有下一个切面执行目标方法,从而达成了如下的执行过程:

如果目标方法抛出异常:
g. 五种通知的常见使用场景
前置通知 记录日志(方法将被调用)
环绕通知 控制事务 权限控制
后置通知 记录日志(方法已经成功调用)
异常通知 异常处理 控制事务
最终通知 记录日志(方法已经调用,但不一定成功)

  1. AOP的注解方式实现
    spring也支持注解方式实现AOP,相对于配置文件方式,注解配置更加的轻量级,配置、修改更加方便,是目前最流行的方式。
    a. 开启AOP的注解配置方式

    b. 将指定的类标志位一个切面

    c. 配置通知 制定切入点规则
    前置通知 @Before
    环绕通知 @Around
    后置通知 @AfterReturning
    异常通知 @AfterThrowing
    最终通知 @After

    **通过注解的配置 等价于 配置文件的配置

    d. 如果一个切面中多个通知 重复使用同一个切入点表达式,则可以将该切入点表达式单独定义,后续引用,注意,在当前切面中通过注解定义的切入点只在当前切面中起作用,其他切面看不到。

    e. 在后置通知的注解中,也可以额外配置一个returning属性,来指定一个参数名接受目标方法执行后的返回值

    f. 在异常通知的注解中,也可以额外配置一个throwing属性,来指定一个参数名接受目标方法抛出的异常对象

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值