0047 Spring的AOP入门基础--切面组件--通知--切入点
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入门基础--切面组件--通知--切入点的更多相关文章
- 02 浅析Spring的AOP(面向切面编程)
1.关于AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.O ...
- Spring Boot - AOP(面向切面)
AOP 全称 Aspect Oriented Programming(面向切面),AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分 ...
- Spring中AOP简介与切面编程的使用
Spring中AOP简介与使用 什么是AOP? Aspect Oriented Programming(AOP),多译作 "面向切面编程",也就是说,对一段程序,从侧面插入,进行操 ...
- Spring核心AOP(面向切面编程)总结
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/75208354冷血之心的博客) 1.AOP概念: 面向切面编程,指扩 ...
- Spring学习-- AOP入门动态代理
AOP 的拦截功能是由 java 中的动态代理来实现的.说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常 ...
- spring.net AOP配置基础
在第一篇中,我们用配置代理工厂的方式实现了面向切面记日志的功能.非常便捷的实现了AOP,但当我们需要对多个切入点配置通知的时候就需要声明多个代理工厂,这样导致配置文件内容过多,配置过程也很繁琐.spr ...
- Spring之AOP实现面向切面编程
近期在学Java的动态代理和Spring面向切面编程,越来越认为Spring设计的真的是太完美了.于是,想一个最简单的样例来跑一下.但问题多多,显示缺少,Aspectj里面的相应的类.导入Aspect ...
- Spring Boot - AOP(面向切面)-切入点表达式
切入点指示符用来指示切入点表达式目的,在 Spring AOP 中目前只有执行方法这一个连接点,Spring AOP 支持的 AspectJ 切入点指示符,切入点表达式可以使用 &&. ...
- Spring-Day03-注解注入&AOP入门-作业
IOC(DI) —— 注解 注解入门: 在applicationContext.xml中引入context约束 打开spring-framework-4.2.4.RELEASE\docs\spring ...
随机推荐
- [Eclipse插件] 安装和使用JD-Eclipse插件
JD-Core 是一个免费的库,从一个或多个“.class”文件中 重构Java源代码.JD-Core可以用来恢复丢失的源代码,并深究Java运行时类库.支持Java 5的功能:如注释,泛型或键入“枚 ...
- ylbtech-LanguageSamples-Indexers(索引器)
ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-Indexers(索引器) 1.A,示例(Sample) 返回顶部 “索引器”示例 本示 ...
- Git系列三之GitHub使用方法
GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub. GitHub 于 2008 年 4 月 10 日正式上线,除了 Git 代 ...
- Java笔记8:Hibernate连接Oracle
1下载hibernate-3.6.0 Final.zip到任意目录,解压缩后得到hibernate目录 2下载slf4j-1.7.13.zip到任意目录,解压缩后得到slf4j-1.7.13 3操作数 ...
- CentOS6.6服务器系统配置(LAMP+phpMyAdmin)全流程
CentOS6.6服务器系统配置(LAMP+phpMyAdmin)全流程 昨天在腾讯云上买了个服务器,是CentOS6.6操作系统的裸机,里面什么都没,然后开始了一天一夜的LAMP(Apache+My ...
- linux中的两个很重要的信号:SIGALRM信号和SIGCHID信号
在进行堵塞式系统调用时.为避免进程陷入无限期的等待,能够为这些堵塞式系统调用设置定时器.Linux提供了alarm系统调用和SIGALRM信号实现这个功能. 要使用定时器.首先要安装S ...
- Drupal启动阶段之二:页面缓存
页面缓存是什么意思?有些页面浏览量非常大,而且与状态无关,这类页面就可以使用页面缓存技术.在页面第一次请求完毕以后,将响应结果保存起来.下一次再请求同一页面时,就不需要从头到尾再执行一遍,只需要将第一 ...
- ConfigurationManager读取dll的配置文件
ConfigurationManager读取dll的配置文件 最近一个项目,需要发布dll给第三方使用,其中需要一些配置参数. 我们知道.NET的exe工程是自带的App.config文件的,编译之后 ...
- j2ee高并发时使用全局变量需要注意的问题
原文:https://blog.csdn.net/jston_learn/article/details/21617311 开发中,全局变量的使用很频繁,但对于多线程的访问,使用全局变量需要注意的地方 ...
- Maven的镜像设置
文件位置 国内的阿里云 <mirrors> <mirror> <id>alimaven</id> <name>aliyun maven< ...