该学习笔记是《尚学堂spring视频教程》的学习笔记第三部分。
11、AOP简介
1、AOP:Aspect-Oriented-Programming
面向切面编程
2、AOP在Spring中作用:
- 提供声明式服务
- 允许用户实现自定义切面
传统的编程模式:
JSP
-->Action
-->Service
--> dao
,纵向的编程模式。
而AOP的编程模式:
它是一种横向的编程模式。可以理解为在不改变原有代码的情况下增加新的功能。就是通过之前提过的代理的方式去增加功能。
3、AOP的优点:
其实就是代理模式的优点,真实角色处理的业务更加纯粹,不用关注公共的业务。公共的业务由代理来完成,实现了业务的分工。公共业务发生改变(拓展)时,变得更加集中和方便。
4、Spring AOP中的概念
关注点:增加某个业务:如安全、缓存、异常等。
切面(Aspect):一个关注点的模块化。
举个例子,日志一般都会在每个方法中都要添加,可以用一个方法将日志封装成一个类。这也就是模块化的理念。
像这里封装好的Log就可以称之为切面了。
通知(advice):在切面的某个特定的连接点上执行的动作。
织入(weaving):把切面连接到其他的应用程序类型或者对象上,并创建一个被通知的对象。
12~13、使用 Spring AOP api
5、通过Spring的api实现AOP
一个简单的通知类型是前置通知
。
接下来要将日志功能切入到UserServiceImpl的
add()
、update()
等方法中。 而目前两者之间尚没有任何的关系。需要在配置文件中进行实现。其中<aop>
部分的内容单独列出:
<aop:config>
<aop:pointcut expression="execution(* cn.sxt.service.UserServiceImpl.add)" id="pointcut"/>
<aop:adviser advice-ref="log" pointcut-ref="pointcut"/>
</aop:config>
在Test类中编写如下内容:
类似的还有
后置通知
的方法,这里忽略。
AOP的重要性:使得业务方法变得更加纯粹。Spring的底层还是通过动态代理实现的。但是通过Spring来实现的话还要比动态代理要简单得多。只需要配置一下就可以让方法加到指定的业务方法上去了,并且分的很清楚,例如是前置通知、后置通知。Spring AOP 可以认为是动态代理的框架。
在不去改变原有代码的基础上改变新的功能。
其本质——将公共的业务(日志、安全等)和领域业务结合。当执行领域业务时就会把公共业务加进来,实现公共业务的重复利用。使得领域业务更加纯粹。
以支付领域的业务为例:
接入第三方接口--(安全检测)--->进行身份验证 -->接下来通过资金验证 --> 完成支付。
这些可以算成是领域业务。
而公共业务则是指:日志、安全、权限、缓存、事务等等。
14、自定义类实现AOP
自定义类如下所示:这里的区别在于Log没有实现Spring中的MethodBeforeAdvice
等接口。所以在配置文件中需要使用<aop:aspect ref="log">
来进行关联。
<aop:config>
<aop:aspect ref="log">
<aop:pointcut expression="execution(* cn.sxt.service.impl.*.*(..))" id="pointcut"/>
<aop:before method="before" pointcut-ref="pointcut"/>
<aop:before method="after" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>
15、使用注解实现AOP
这是接着上面的通过Spring api、自定义类之外的实现AOP的第三种实现AOP的方法。
可以理解为将配置文件中的部分内容放在类中。这里对Log类进行一些修改,主要是在类的前面添加了@Aspect
注解,而在方法中添加了@Before
和@After
注解。
网友评论