AOP的全称是Aspect Oriented Programming,面向切面编程。

切面是什么呢,就是一个Java类。之所以叫切面,就是说在调用其他一些类的方法的某个时候(之前,之后,抛异常等),调用这个类里的某个方法,因为要对很多类的很多方法进行相同的作用,就像一刀切一样。

aop涉及到三个要素:将哪个类的哪个方法,在什么时候,切入到哪个类的哪个方法上。依次对应了切面组件Aspect、通知Advice、切入点pointcut

看下面的示例,一个Controller组件,一个Service组件,两个Aspect组件,一个测试类,代码如下:

//Controller组件
package net.sonng.controller; import javax.annotation.Resource; import net.sonng.service.TestService; import org.springframework.stereotype.Controller; @Controller
public class TestController {
@Resource
private TestService ts;
public void testA(){
System.out.println("Controller的testA方法开始执行");
ts.testA();
ts.testB();
} public void testB(){
System.out.println("Controller的testB方法开始执行");
}
}
//Service组件
package net.sonng.service; import org.springframework.stereotype.Service; @Service
public class TestService {
public void testA (){
System.out.println("TestService的TestA方法开始执行");
} public void testB(){
System.out.println("TestService的TestB方法开始执行");
}
}
//切面A
package net.sonng.aspect; import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component; @Component
public class TestLogA {
public void log(){
System.out.println("TestLogA是切面组件,切入点是Controller的方法前面");
}
}
//切面B
package net.sonng.aspect; import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component; @Component
@Aspect
public class TestLogB { @Before("execution(* net.sonng.service.TestService.testA(..))") //方法限定表达式
public void log(){
System.out.println("TestLogB是切面组件,在调用Service方法前调用");
}
}
//测试类
package net.sonng.test; import net.sonng.controller.TestController; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test {
public static void main(String[] args){
ApplicationContext ac=new ClassPathXmlApplicationContext("ac.xml");
TestController tc=ac.getBean("testController",TestController.class);
tc.testA();
tc.testB(); }
}

采用xml配置,TestLogA的log方法在Controller组件的所有方法调用前调用

ac.xml配置如下:

<mvc:annotation-driven />   <!-- 开启注解扫描 -->
<context:component-scan base-package="net.sonng" /> <!-- 开启组件扫描 -->
<aop:aspectj-autoproxy /> <!-- 开启AOP注解扫描 --> <bean id="log" class="net.sonng.aspect.TestLogA"></bean> <!-- 声明切面组件 -->
<aop:config>
<aop:aspect ref="log" > <!-- 以log为切面组件 -->
<aop:before method="log" pointcut="within(net.sonng.controller.TestController)"/>
</aop:aspect> <!-- aop:before是前置通知;method表示要调用的切面的方法;pointcut表示切入点,可以用类型/方法限定表达式 -->
</aop:config>
<!-- 这个xml配置表示:在net.sonng.controller.TestController下的所有方法被调用前,先调用net.sonng.aspect.TestLogA的log方法 -->

用注解配置,TestLogB的log方法在TestService的testA()方法调用前调用

注解配置见代码,要点如下:

1. 用@Aspect声明TestLogB是一个切面组件

2. 在log方法前添加@Before注解,这是前置通知

3. 在@Before注解的属性中指定切入点,这里用的是方法限定表达式

测试类输出如下:

TestLogA是切面组件,切入点是Controller的方法前面 //TestLogA的log方法在Controller的testA()方法前调用

Controller的testA方法开始执行

TestLogB是切面组件,在调用Service方法前调用 //TestLogB的log方法在Service的testA()方法前调用

TestService的TestA方法开始执行

TestService的TestB方法开始执行 //因为TestLogB的log方法指定了只在testA前调用,在testB前不调用

TestLogA是切面组件,切入点是Controller的方法前面 //TestLogA的log方法在Controller的testB()方法前调用

Controller的testB方法开始执行

切面组件Aspect

切面组件一般是登录检查、日志记录、事务管理等

xml配置中先声明bean,再在aop:config的aop:aspect中指定为切面

或者用@Aspect注解指定

通知advice

通知就是:在调用目标方法的什么时候调用切面组件的方法,可以是:

前置通知:@Before,方法调用之前

后置通知:@AfterReturning,方法正常返回

异常通知:@AfterThrowing,方法调用过程中出现异常

最终通知:@After,不管方法是正常返回还是出现异常,这个通知都会调用,因此必须这两种可能的情况

环绕通知:@Around,

切入点

切入点就是要在哪些类的哪些方法上进行切入,可以限定一些类下的所有方法,或者不同类下的一些方法,或者指定类下的指定方法

方法限定表达式:

    基本模式:execution([修饰符] 返回值类型 方法名(参数) [异常类型])。具体见Spring Reference 4.3.6版第223页

    execution(public * * (..)):所有 的public方法

    execution(* set(..)):以set打头的任意方法

    execution(
com.xyz.service.SomeService.(..):SomeService类下的任意方法

    execution(
com.xyz.service..(..)):service包下的任意类的任意方法

类型限定表达式:

    within(com.xyz.service.):service包下的任意类下的任意方法,不包含子包

    within(com.xyz.service..
):包含子包

0047 Spring的AOP入门基础--切面组件--通知--切入点的更多相关文章

  1. 02 浅析Spring的AOP(面向切面编程)

    1.关于AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.O ...

  2. Spring Boot - AOP(面向切面)

    AOP 全称 Aspect Oriented Programming(面向切面),AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分 ...

  3. Spring中AOP简介与切面编程的使用

    Spring中AOP简介与使用 什么是AOP? Aspect Oriented Programming(AOP),多译作 "面向切面编程",也就是说,对一段程序,从侧面插入,进行操 ...

  4. Spring核心AOP(面向切面编程)总结

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/75208354冷血之心的博客) 1.AOP概念: 面向切面编程,指扩 ...

  5. Spring学习-- AOP入门动态代理

    AOP 的拦截功能是由 java 中的动态代理来实现的.说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常 ...

  6. spring.net AOP配置基础

    在第一篇中,我们用配置代理工厂的方式实现了面向切面记日志的功能.非常便捷的实现了AOP,但当我们需要对多个切入点配置通知的时候就需要声明多个代理工厂,这样导致配置文件内容过多,配置过程也很繁琐.spr ...

  7. Spring之AOP实现面向切面编程

    近期在学Java的动态代理和Spring面向切面编程,越来越认为Spring设计的真的是太完美了.于是,想一个最简单的样例来跑一下.但问题多多,显示缺少,Aspectj里面的相应的类.导入Aspect ...

  8. Spring Boot - AOP(面向切面)-切入点表达式

    切入点指示符用来指示切入点表达式目的,在 Spring AOP 中目前只有执行方法这一个连接点,Spring AOP 支持的 AspectJ 切入点指示符,切入点表达式可以使用 &&. ...

  9. Spring-Day03-注解注入&AOP入门-作业

    IOC(DI) —— 注解 注解入门: 在applicationContext.xml中引入context约束 打开spring-framework-4.2.4.RELEASE\docs\spring ...

随机推荐

  1. 摄像头模组 PDAF对焦(Phase Detection Auto Focus)

    本文主要是最近看的两个文档的总结,相对零散的笔记,包括<imx298 software reference PDAF>与<PDAF Truly>. 1.PDAF功能的实现需要使 ...

  2. 两张表的笛卡尔积用sql语句

    第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小SELECT * FROM table1 CROSS JOIN table2

  3. ES集群Master节点配置问题

    ES集群的主节点发现机制采用单播形式,主要配置有三行,如下: discovery.zen.minimum_master_nodes: discovery.zen.ping.multicast.enab ...

  4. maven 编码GBK的不可映射字符 或者 UTF-8

    要通过修改pom.xml文件,告诉maven这个项目使用UTF-8来编译. 方案一: 在pom.xml的/project/build/plugins/下的编译插件声明中加入下面的配置:<enco ...

  5. VP9 Video Codec

    http://www.webmproject.org/vp9/ WebM Repositories libvpx: VP8/VP9 Codec SDK   pull http://git.chromi ...

  6. DevExpress.Build.v14.2

    DevExpress.Build.v14.2 using Microsoft.Build.AppxPackage; using Microsoft.Build.Framework; using Sys ...

  7. [Javascript] Automate the process of flattening deeply nested arrays using ES2019's flat method

    Among the features introduced to the language of JavaScript in ES2019 is Array.prototype.flat. In th ...

  8. CAD启动找不到AC1ST16.DLL

    今天在安装Win7 x64上CAD2006启动报错:找不到ac1st16.dll文件. 一查,是系统变量的问题.在系统变量Path中cad的路径为: C:\Program Files (x86)\Co ...

  9. 安装kubernetes dashboard

    一.kubernetes dashboard kubernetes dashboard是k8s的web管理界面 二.安装 k8s的版本为1.5 1.创建dashboard-controller.yam ...

  10. Mysql 如何查询两个时间段之间的数据?

    Mysql 如何查询两个时间段之间的数据?