发表于: 2018-04-05 17:22:47
1 602
今天完成的事情:(一定要写非常细致的内容,比如说学会了盒子模型,了解了Margin)
今天好好了解了下aop。
一. AOP
所谓Aop就是 Aspect-OrientedProgramming, 中文就是面向切面编程。
我们之前听说面向过程编程, 以及面向对象编程, 而这个面向切面编程我们可以视为是面向对象编程的1个补充(增强);
在一般的方法(函数)中, 为了方便,可能只写了业务代码
1. 业务代码
而我们我们可以将其补充成4个部分。
- 验证参数
- 前置日志
- 业务代码
- 后置日志
1.1 横切关注点 (Crosscutting Concerns)
大家看上面的方法, 就像用刀子把1个方法横向切成4块, 我们把上面除业务代码外任意一个部分就叫做横切关注点.
1.2 切面 (Aspect)
我们可以把横切关注点进行分组, 其中任意一组就叫做切面
例如上面的例子中, 我们可以分成
- 验证切面 (1. 验证参数)
- 日志切面 (2. 前置日志, 4.后置日志)
1.3 通知 (Advice)
所谓通知就是切面要完成的工作。
例如对于日志通知来讲, 里面执行日志的方法我们就可以称为1个通知。
1.4 目标 (Target)
所谓目标就是被通知的对象, 也就是指上面例子中的原方法本身啦。
1.5 代理 (Proxy)
当目标被通知后产生的对象就叫做代理, 因为AOP的原理就是利用代理来实现的, 如果想了解动态代理的可以参考这里
1.6 连接点 (Joinpoint)
所谓Joinpoint就是程序执行到的某个位置,
上面例子中, 业务代码方法的执行之前, 执行之后, 抛出异常后 都可以视为某个连接点。
1.7 切点 (PointCut)
每个方法都存在多个连接点, 而Spring AOP利用切点来定位到具体那些连接点。
Joinpoint 和 PointCut 的关系可以作如下比喻,假如Joinpoint的数据里的记录, 那么PointCut就相当于查询条件
1.8 小结
而Spring的AOP 能在不修改具体某个方法的前提下, 利用动态代理技术将通知注入到这个方法的各个连接点中, 令到这个方法得到了必要的补充。
对于上面的例子中, 我们原来的方法只有业务代码, 但是我们可以利用Spring AOP加入 验证参数, 日志等功能!
首先需要引入以下依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.8</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.8</version>
</dependency>
然后在spring配置文件中加入一下一句话:
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
在aspect类上写两个标签
@Aspect
@Component
需要对目标做的通知方法前,添加@Before@After@Around等注解,
且令值value="execution(public * com.ev.controller.StudentController.*(..))"以及dao层和service层。
项目中, 如果不用AOP 我们往往要为每个方法添加日志代码, 十分难于维护, 可读性也大大下降, 而AOP的出现, 就能解决这些问题。
明天计划的事情:(一定要写非常细致的内容)
完成aop类,通过脚本得到db连接,service层相应,和controller层响应的时间。
遇到的问题:(遇到什么困难,怎么解决的)
aop本质事动态代理,但是动态代理还是不能很好的理解具体实现。
收获:(通过今天的学习,学到了什么知识)
aop是一种方便而且对源代码影响最小的业务代码与无关代码结合方式。
评论