云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

金山云_阿里云客服招募_排行榜

小七 141 0

金山云_阿里云客服招募_排行榜

模板方法模式装饰者模式AOP解决方案

对于初学者来说,spark大数据,wikipedia中AOP的定义似乎有点难以理解,因此在本博客中,我用一个例子来介绍我们为什么需要它。

假设我有一个order命令类,它在方法doBusiness中执行其核心业务逻辑:

在方法execute()中,它充斥了太多的非功能性代码,比如日志记录、授权检查和性能跟踪。

这不是一个好的设计,我们可以尝试通过模板方法模式来改进它。

通过这个模式,我创建了一个新的父类BaseCommand,

现在真正的业务逻辑是在子类OrderCommand中定义的,它的实现非常干净:

这种解决方案的缺点是父类已经定义了模板方法的执行,子类不可能适应它,例如,子类不能更改授权检查和性能跟踪方法的顺序。假设一个子类根本不想实现授权检查——这在这个解决方案中是无法实现的。我们必须改用decorator模式。

首先我需要创建一个接口:

并创建一个decorator来覆盖日志和授权检查功能:

和第二个decorator来跟踪性能:

和类来完成真正的业务逻辑。现在我完全可以灵活地根据实际的业务案例,在不同的decorator的帮助下构造实例。下面的实例fullCmd同时拥有授权检查日志和性能跟踪的功能

假设在给定的场景中,返现是什么意思,只需要性能跟踪,我们可以使用性能跟踪decorator:

decorator模式的缺点:decorator类和business类必须实现同一个接口、命令,这是更多业务相关。非功能实现的实用程序类是否有可能在不实现由业务类实现的相同接口的情况下工作?

我使用Spring框架实现的Java项目来演示这个想法。整个项目的源代码可以从git库中找到。

假设我希望在这个业务方法上添加性能跟踪:save。

1。您可能已经观察到第10行中使用的注释@Log(nameI042416="annotation for save method")。

此注释在文件中声明日志.java:

2. 现在我必须声明一个包含切入点的方面类。一个切入点告诉Spring框架哪些方法可以用AOP策略应用,用@Aspect注释的类包含Spring框架应该调用的方法来"修饰"注释标识的方法。下面我已经通过注解@pointcut声明了一个切入点"logJerry":

例如,云服务器 免费,我们已经用"@Log(nameI042416="annotation For save method")"注解了业务方法save(),

我们可以通过@Before和@After加上声明的切入点来定义必须对其执行的逻辑。

使用这种方法,我可以添加性能跟踪功能来保存方法,而无需修改其源代码。

在这些beforeExec和afterExec方法上设置断点,在调试模式下使用Tomcat启动项目,私人云服务器,将以下url粘贴到浏览器:

:9498/springaop/aopRootJerry/aop2Jerry/i042416?string=sap

通过callstack,您可以了解AOP调用在Spring中是如何工作的。

为什么我们说AOP可以通过允许分离横切关注点来增加模块化?

假设我们有很多方法,所有这些方法都需要通用工具,全国大数据中心,如日志、性能跟踪和授权检查。在使用AOP之前,这些实用程序分散在每个方法中:

在使用AOP之后,这些公共的东西被提取到Aspect类中,实现了可重用性。从下面的图片中,我们可以看到横切关注点现在被分开了