前言
在通常业务处理中,主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似,所以就需要集中处理这些共同之处以达到减少代码冗余问题的发生。
一、springAop概念
AOP是一种编程思想,是通过预编译方式和运行期动态代理的方式实现不修改源代码的情况下给程序动态统一添加功能的技术。
AOP(Aspect-Oriented Programming)即面向切面编程。是spring两大核心之一,它是一种编程思想,是对OOP(面向对象)的一种补充。它可以对业务逻辑的各个部分进行隔离,降低耦合,提高代码的可重用性。应用场景有事务、日志管理等。
常用的AOP:Spring AOP;JBoss AOP;AspectJ;
作用:Aop 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离,方便操作,从而提高效率。
实现AOP的技术,主要分为两大类:1.使用注解;
2.配置xml文件;
二、实现方式
1.注解
@Aspectj
public class Demo {
@Pointcut(value="execution(* com.ape.service.*.*.*(..))")
public void point() {System.out.println("hello");}
@Before(value="point()")
public void before() {
System.out.println("begin");
}
@AfterReturning(value = "point()")
public void after() {
System.out.println("commit");
}
@Around("point()")
public void around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("*****begin*****");
joinPoint.proceed();
System.out.println("*****commit*****");
}
}
2.xml文件
配置xml文件四种方式:
1. 配置ProxyFactoryBean
2. 配置AutoProxyCreator
3. 通过<aop:config>来配置
<aop:config>
<aop:aspect ref="log">
<aop:pointcut
expression="(execution(* spring.ch3.topic1.Chief.*(..)))"
id="chiefPointCut" />
<aop:before method="washOven" pointcut-ref="chiefPointCut" />
<aop:before method="prepare" pointcut-ref="chiefPointCut" />
<aop:after method="after" pointcut-ref="chiefPointCut" />
</aop:aspect>
</aop:config>
4. 通过<aop: aspectj-autoproxy>来配置,使用AspectJ的注解来标识通知及切入点
<aop:aspectj-autoproxy />
<bean id="transactionDemo" class="com.ape.Demo" />
三.AOP术语
Aspect/Advisors(切面)
一个关注点的模块化,这个关注点可能会横切多个对象。在Spring AOP中,切面可以使用基于模式或者基于@Aspect注解的方式来实现。
Join point(连接点)
在程序执行期间的一点。在Spring AOP中,连接点总是表示方法执行。
Advice(通知)
在切面的某个特定的连接点上执行的动作。许多AOP框架(包括Spring)都是以拦截器做通知模型,并维护一个以连接点为中心的拦截器链。
Pointcut(切入点)
查找连接点的条件。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行。
Introduction(引入)
给一个类型声明额外的方法或属性。Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。
Target object(目标对象)
被一个或者多个切面所通知的对象。也被称做被通知(advised)对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个被代理(proxied)对象。
AOP proxy
AOP框架创建的对象,用来实现切面契约(例如通知方法执行等等)。在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。
Weaving(织入)
织入是一个过程,是将切面应用到目标对象从而创建出AOP代理对象的过程,织入可以在编译期、类装载期、运行期进行。
3.Spring AOP代理对象的生成
Spring提供了两种方式来生成代理对象: JDK动态代理和CGLIB动态代理。
JDK动态代理:通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口.JDK动态代理的核心是InvocationHandler接口和代理类。