AOP,面向切面编程,目的是为了在尽量不改变原本项目的代码的情况下,在代码功能上进行增强。
◆增强处理/通知/建议 ( Advice )
在切面的某个特定的连接点上执行的动作。其中包括了“around”、“before”和“after”等不同类型的通知(通知的类型将在后面部分进行讨论)。许多AOP框架(包括Spring)都是以拦截器做通知模型,并维护一个以连接点为中心的拦截器链。
◆切入点( Pointcut )
匹配连接点的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。
◆连接点( Join Point )
在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。在Spring AOP中,一个连接点总是表示一个方法的执行。
◆切面(Aspect)
一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是JavaEE应用中一个关于横切关注点的很好的例子。在Spring AOP中,切面可以使用基于xml配置文件或者基于@Aspect注解的方式来实现。
◆目标对象( Target object )
被一个或者多个切面所通知的对象。也被称做被通知(advised)对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个被代理(proxied)对象。
◆AOP代理( AOP proxy )
AOP框架创建的对象,用来实现切面契约(例如:通知方法执行等等)。在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。
◆织入 ( Weaving )
把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象。这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。
◆引入(Introduction):
用来给一个类型声明额外的方法或属性(也被称为连接类型声明(inter-type declaration))。Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如,你可以使用引入来使一个bean实现IsModified接口,以便简化缓存机制。
这里介绍用注解实现aop
依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.12</version>
</dependency>
xml配置文件
要用基于xml的配置启用@AspectJ支持,请使用aop:aspectj-autoproxy元素,如下面的示例所示
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
其实编写AOP流程很简单,创建切面类->定义切入点 即要增强哪些类或方法,确定位置->定义切入点通知
以下为实例
对com.example.demo包下的类加强
package com.example.demo.pointcut;
import com.example.demo.HelloSpring;
import com.sun.org.slf4j.internal.Logger;
import com.sun.org.slf4j.internal.LoggerFactory;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class PointCut1 {
// 在IDE控制台打印日志,便于开发,一般加在最上面
private Logger logger = LoggerFactory.getLogger(HelloSpring.class);
//定义切点,即要增强哪些类或方法,确定位置
@Pointcut(value = "execution(* com.example.demo.*.*(..))")
public void mypointcut()
{
}
// 环绕通知,切入点前后都执行
@Around("mypointcut()")
public Object myLogger(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("环绕通知插入");
return null;
}
}
注意关于pointcut切入点