SpringAOP的一点理解
AOP的原理解释
Spring作为轻量级的IOC和AOP的框架,其AOP的特性是十分重要的
我们先看AOP的官方解释:AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
此时我们可以得知AOP的原理:面向切面原理,在不改变三层架构的代码基础上,对要增加的业务在相应的层面上水平的增加代理类(只是举例),让代理类实现对应的功能,很好理解,AOP就是在保持原有代码的基础上,增加对应的功能和部件。
Aop在Spring中的作用
提供声明式事务,允许用户自定义切面
以下名词需要了解下:
横切关注点:跨越应用程序多个模块的方法或功能。即是,与我们业务逻辑无关的,但是我们需要关注的部分,就是横切关注点。如日志 , 安全 , 缓存 , 事务等等 …
- 切面(ASPECT):横切关注点 被模块化 的特殊对象。即,它是一个类。
- 通知(Advice):切面必须要完成的工作。即,它是类中的一个方法。
- 目标(Target):被通知对象。
- 代理(Proxy):向目标对象应用通知之后创建的对象。
- 切入点(PointCut):切面通知 执行的 “地点”的定义。
- 连接点(JointPoint):与切入点匹配的执行点。
如何使用AOP进行开发
要使用AOP开发,要pom配置文件导入其对应的支持
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.7</version>
</dependency>
此时我们可以选择在ApplicationContext.xml中进行配置,导入相应aop的依赖支持
在配置文件中有:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 配置aop,需要导入约束-->
<aop:config>
<!-- 切入点;expression:表达式 execution(要执行的位置! * * * * *) -->
<aop:pointcut id="pointcut" expression="execution(* Test.Service.UserServiceImpl.*(..))"/>
</aop:config>
实现AOP的开发,可以有三种方式:
- 使用Spring的API接口
- 自定义AOP
- 使用注解
强制使用CGLIB生成代理
我们可以了解到Spring使用动态代理或是CGLIB生成代理是有规则的,高版本的Spring会自动选择是使用动态代理还是CGLIB生成代理内容,当然我们也可以强制使用CGLIB生成代理,那就是aop:config里面有一个"proxy-target-class"属性,这个属性值如果被设置为true,那么基于类的代理将起作用,如果proxy-target-class被设置为false或者这个属性被省略,那么基于接口的代理将起作用。