一、AOP
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
在实际中,例如对数据库的操作需要添加事务控制,而事务控制对于每一个业务逻辑都必不可少,但是其又是重复代码,这时就可以将这部分重复代码提取出来交给框架,在每个业务逻辑执行为其添加这一部分重复的事务控制代码。
AOP就做到了在程序运行期间,不修改源码对已有方法进行增强,能
减少重复代码
提高开发效率
维护更方便。
二、Spring中的AOP
Spring使用动态代理技术实现AOP,而动态代理是依靠反射来实现的。在动态代理之下,字节码随用随创建,随用随加载,同时能对被代理类的方法进行增强。
1基于xml文件的AOP配置
1.1 导入maven依赖
除了spring-context包外,还需要导入aspectjweaver包,具体依赖如下
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.7</version>
</dependency>
1.2 创建spring的配置文件并导入约束
具体约束如下
<?xml version="1.0" encoding="UTF-8"?>
<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
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
1.3 在xml配置文件下配置AOP
使用aop:config标签配置
在aop:config内使用aop:pointcu标签配置切入点表达式,该标签的
expression属性:用于定义切入点表达式
(execution(* com.itheima.service.impl..(…)) 返回值可以用通配,包名也可以用通配,参数可以用…通配)
id属性:用于给切入点提供一个唯一标识符
在aop:config内部使用aop:aspect标签配置切面,该标签的
id属性:给切面提供一个唯一标识符;
ref属性:通知类(重复代码坐在的类)bean的id
在aop:aspect标签内部使用
aop:before标签:method属性:通知类中的方法名,pointcut-ref属性:切入点表达式的引用,pointcut:切入点表达式
aop:after-returning标签:method属性:通知类中的方法名,pointcut-ref属性:切入点表达式的引用,pointcut:切入点表达式
aop:after-throwing标签:method属性:通知类中的方法名,pointcut-ref属性:切入点表达式的引用,pointcut:切入点表达式
aop:after标签:method属性:通知类中的方法名,pointcut-ref属性:切入点表达式的引用,pointcut:切入点表达式
<aop:config>
<!--配置切面 -->
<aop:aspect id="logAdvice" ref="logger">
<!-- 配置通知的类型,并且建立通知方法和切入点方法的关联-->
<aop:before method="printLog" pointcut="execution(* com.itheima.service.impl.*.*(..))"> </aop:before>
</aop:aspect>
</aop:config>
2 基于注解的AOP
2.1导入context的名称空间
<?xml version="1.0" encoding="UTF-8"?>
<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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
并开启对注解AOP的支持
<aop:aspectj-autoproxy/>
若没有xml文件的话,在Spring的配置类之前加@EnableAspectJAutoProxy注解
2.2 配置通知类的注解
@Aspect:表明当前类是个通知类(重复代码,增强代码所在的类)
@Pointcut:用于指定切入点表达式value属性
@Pointcut("execution(* xx.xxx.xxx.(..)")
private void pc(){}
@Before/@AfterReturning/@AfterThrowing/@After value属性:用于指定切入点表达式,还可以指定切入点表达式引用
@Before("pc()")