java 两个service一个有事务一个没有_北京尚学堂卓越班252天[第067天]——Java

AOP编程(aspect oriented program)面向切面编程

A) 静态代理设计模式

8edbff3407e30ee5f364fd32104f38b9.png

d466abed8338fb1161ebe3b94f36db99.png

de368b128fc6fa70910ac8c29b470634.png

现实生活中的场景:

e1dd80bafc1e9c439a7ddff2aa0e2d14.png

概念:通过代理类为原始类增加额外功能。

好处:避免原始类因为额外功能频繁被修改,从而使代码更加利于维护。

名词解释:

1. 原始类或者目标类(target):那些只负责核心功能,没有加入额外功能的类。纯净的Service。

2. 原始功能,原始方法:原始类中的方法,没有加入额外功能的方法。

3. 额外功能:可有可无的,附加的功能。

代理类本质 = 原始类 + 额外功能 + 实现原始类的相同接口

静态代理设计模式的问题:

1. 代理类的数量过多,不利于项目管理。

2. 额外功能的代码冗余。

3. 替换代理的额外功能太麻烦。

B) Spring的动态代理设计模式

概念:通过代理类为原始类增加额外功能。

好处:利于原始类维护。

动态代理中需要引入额外的两个第三方依赖jar包:

com.springsource.org.aopalliance-1.0.0.jar

com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

1. 开发步骤

A) 创建原始对象(Service没有额外功能)

7036e18d57ed22bfdbaf0d8be56a9f72.png

B) 创建额外功能Advice(接口)

Advice接口有四个子接口:

MethodBeforeAdvice(前置通知)

额外功能需要在原始方法执行之前执行。

cc337920f1c5de4d5e9a552d0fdb38ea.png

AfterReturningAdvice(后置通知)

额外功能需要在原始方法执行之后执行。

11f670bf635d684f0c92b18e11d64ed4.png

MethodInterceptor(环绕通知)

注意:这个接口不是Spring提供的,是AopAliance提供的。

额外功能需要在原始方法执行之前和之后执行(最重要的功能就是控制事务)。

c5e87c905a8d2abeddc9b22b3b2c86ba.png

e8c50e6c7cccdff9bb86809ead08a80a.png

ThrowsAdvice 额外功能需要在原始方法抛出异常时执行。(异常处理通知)

注意:ThrowsAdvice接口是一个没有定义方法的接口,我们称之为TagInterface标志性接口,这种标志性接口还有:Seriazable ThrowsAdvice Remote。

ThrowsAdvice接口的额外功能主要用于事务回滚。

23ea965f2c16058cbf1d14399fb12f39.png

C) 定义切入点(pointcut)

切入点决定了额外功能加入的位置。

32c8905de13afc6f5c3c53bd65acc406.png

1. 方法切入点

定义额外功能需要加入给哪些方法,上面execution(* *(..))就是一个典型的方法切入点。

注意:

切入点表达式最外层是一个切入点函数execution(),这是死的,真正活的是切入点函数里面的切入点表达式。

切入点表达式:* *(..)代表所有方法加入额外功能

5886e0e698f70aa6207e9e0e6b19df10.png

按照要求写切入点表达式:

A) 为login方法加入额外功能:* login(..)

B) 为只有一个字符串参数的login方法加入额外功能:

* login(String)

注意:参数是String类型,而String类型是属于java.lang包中的,所以可以直接写String,如果参数不是java.lang包下面的类型,那么参数在书写的时候,必须写全限定名。比如:

* register(com.liw.User)

C) 为有两个字符串类型参数的login方法加入额外功能:

* login(String,String)

D) * login(String,..)表达的含义:login方法参数中第一个参数是String类型的,然后后面的参数没有要求,没有要求的意思是可以有其它参数,并且类型不限,也可以没有其它参数。

2. 类切入点

定义额外功能加入给哪个类,切入点表达式仍然写在execution()函数中。

523020cc850f454a735171616f9ac6d6.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值