写在前面
咱们继续参考Spring官方文档
前文浅谈Spring(1)我们都是用的配置文件,十分的麻烦,用咱们注解会好很多
1、注解
略
--------------------------------------我是分割线-----------------------下面正文-----------------------------------------
AOP
官方文档很好用,就是太长了。
-
方面:跨越多个类的关注点的模块化。事务管理是企业 Java 应用程序中横切关注点的一个很好的例子。在 Spring AOP 中,方面是通过使用常规类(基于模式的方法)或使用
@Aspect
注解注解的常规类 (@AspectJ 风格)实现的。 -
连接点:程序执行过程中的一个点,例如方法的执行或异常的处理。在 Spring AOP 中,一个连接点总是代表一个方法的执行。
-
建议:方面在特定连接点采取的行动。不同类型的建议包括“周围”、“之前”和“之后”建议。(通知类型将在后面讨论。)许多 AOP 框架,包括 Spring,将通知建模为拦截器,并在连接点周围维护一个拦截器链。
-
切入点:匹配连接点的谓词。Advice 与切入点表达式相关联,并在与切入点匹配的任何连接点处运行(例如,执行具有特定名称的方法)。由切入点表达式匹配的连接点的概念是 AOP 的核心,Spring 默认使用 AspectJ 切入点表达式语言。
-
简介:代表类型声明额外的方法或字段。Spring AOP 允许您向任何建议的对象引入新的接口(和相应的实现)。例如,您可以使用介绍使 bean 实现
IsModified
接口,以简化缓存。(介绍在 AspectJ 社区中称为类型间声明。) -
目标对象:被一个或多个切面建议的对象。也称为“建议对象”。由于 Spring AOP 是使用运行时代理实现的,所以这个对象始终是一个被代理的对象。
-
AOP 代理:由 AOP 框架创建的对象,用于实现方面契约(建议方法执行等)。在 Spring Framework 中,AOP 代理是 JDK 动态代理或 CGLIB 代理。
-
编织:将切面与其他应用程序类型或对象联系起来,以创建建议对象。这可以在编译时(例如,使用 AspectJ 编译器)、加载时或运行时完成。Spring AOP 与其他纯 Java AOP 框架一样,在运行时执行编织。
通知
-
前通知before:在连接点之前运行的通知,但不能阻止执行流继续到连接点(除非它抛出异常)。
-
返回后通知AfterReturning:在连接点正常完成后运行的通知(例如,如果方法返回而没有抛出异常)。
-
抛出通知后AfterThrowing:如果方法通过抛出异常退出,则运行通知。
-
最终通知After (finally) :不管连接点退出的方式(正常或异常返回)都将运行的通知。
-
环绕通知Around:环绕连接点的通知,例如方法调用。这是最有力的建议。环绕通知可以在方法调用之前和之后执行自定义行为。它还负责选择是继续连接点还是通过返回自己的返回值或抛出异常来缩短建议的方法执行。
切入点匹配的连接点概念是 AOP 的关键,它区别于仅提供拦截的旧技术。切入点使建议能够独立于面向对象的层次结构而成为目标。例如,您可以将提供声明式事务管理的环绕通知应用于一组跨越多个对象的方法(例如服务层中的所有业务操作)。
声明一个切入点
切入点确定感兴趣的连接点,从而使我们能够控制通知何时运行。Spring AOP 仅支持 Spring bean 的方法执行连接点,因此您可以将切入点视为匹配 Spring bean 上方法的执行。一个切入点声明有两个部分:一个包含名称和任何参数的签名以及一个切入点表达式,它确定我们对哪些方法执行感兴趣。在 AOP 的@AspectJ 注释样式中,一个切入点签名由常规方法定义提供,并且切入点表达式通过使用@Pointcut
注解(作为切入点签名的方法必须有void
返回类型)。
-
execution
: 用于匹配方法执行连接点。这是使用 Spring AOP 时要使用的主要切入点指示符。 -
within
:将匹配限制为某些类型内的连接点(使用 Spring AOP 时在匹配类型中声明的方法的执行)。 -
this
: 限制匹配连接点(使用 Spring AOP 时的方法执行),其中 bean 引用(Spring AOP 代理)是给定类型的实例。 -
target
: 限制匹配连接点(使用 Spring AOP 时的方法执行),其中目标对象(被代理的应用程序对象)是给定类型的实例。 -
args
: 限制匹配连接点(使用 Spring AOP 时的方法执行),其中参数是给定类型的实例。 -
@target
: 将匹配限制为连接点(使用 Spring AOP 时的方法执行),其中执行对象的类具有给定类型的注释。 -
@args
:限制匹配连接点(使用 Spring AOP 时的方法执行),其中传递的实际参数的运行时类型具有给定类型的注释。 -
@within
: 限制匹配到具有给定注解的类型中的连接点(使用 Spring AOP 时,在具有给定注解的类型中声明的方法的执行)。 -
@annotation
:将匹配限制为连接点的主题(在 Spring AOP 中运行的方法)具有给定注释的连接点。
@Pointcut("execution(* zhou.com.pojo.User.toString())")
private void anyOldTransfer() {
}
@Before(value = "anyOldTransfer()")
private void before(){
System.out.println("before");
}
@After(value = "anyOldTransfer()")
private void after(){
System.out.println("after");
}
@AfterReturning(value = "anyOldTransfer()",returning = "o")
private void afterReturning(Object o){
System.out.println(o);
System.out.println("afterReturning");
}
@AfterThrowing(value = "anyOldTransfer()")
private void afterThrowing(){
System.out.println("afterThrowing");
}
@Around(value = "anyOldTransfer()")
private Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("前");
Object o=pjp.proceed();
System.out.println("后");
return o;
}
Spring aop xml文件配置
<context:property-placeholder location="jdbc.properties"/>
<context:component-scan base-package="zhou.com"/>
<aop:aspectj-autoproxy/>
<aop:config>
<aop:aspect id="myAspect" ref="userProxy">
<aop:pointcut id="businessService" expression="execution(* zhou.com.pojo.User.toString())"/>
<aop:after method="before" pointcut-ref="businessService"/>
<aop:before method="before" pointcut-ref="businessService"/>
</aop:aspect>
</aop:config>
效果一样
写在最后
要想学好,建议把咱们Spring官方文档看上20遍。