博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring详解篇之 AOP面向切面编程
阅读量:4841 次
发布时间:2019-06-11

本文共 3906 字,大约阅读时间需要 13 分钟。

一、概述

Aop(aspect oriented programming面向切面编程),是spring框架的另一个特征。AOP包括切面、连接点、通知(advice)、切入点(pointCut) 。

1.aop几个概念:

  • 横切关注点: 对哪些方面进行拦截,拦截后怎么处理。
  • 切面(aspect):切面是横切关注点的抽象。
  • 连接点(joinpoint):被拦截的方法
  • 切入点(pointcut):对连接点进行拦截的定义。
  • 通知(advice):拦截到连接点之后要执行的代码
  • 目标对象:代理的目标对象
  • 织入
  • 引入

2.主要功能:

  • 日志记录
  • 性能统计
  • 安全控制
  • 事物处理
  • 异常处理

3.advice类型:

  • 前置通知(before advice)
  • 返回后通知(after returning advice)
  • 抛出异常后通知(after throwing advice)
  • 后通知(after advice)
  • 环绕通知(around advice)

4.Spring对AOP的支持

Spring中AOP代理由Spring的IOC容器负责生成、管理,其依赖关系也由IOC容器负责管理。因此,AOP代理可以直接使用容器中的其它bean实例作为目标,这种关系可由IOC容器的依赖注入提供。

二、基于xml配置的aop

在spring基于schemel中,aop需要声明一个切面aspect,一个pointcut,一个advisor.

举个例子:

切面:

public class MoocAspect {      public void before() {   	System.out.println("MoocAspect before.");   }      }

切点:

public class AspectBiz {      public void biz() {   	System.out.println("AspectBiz biz.");//		throw new RuntimeException();   }

配置文件:

单元测试:

@RunWith(BlockJUnit4ClassRunner.class)public class TestAOPSchemaAdvice extends UnitTestBase {      public TestAOPSchemaAdvice() {   	super("classpath:spring-aop-schema-advice.xml");   }      @Test   public void testBiz() {   	AspectBiz biz = super.getBean("aspectBiz");   	biz.biz();   }}

运行:

MoocAspect before.

AspectBiz biz.

这是 机遇 schemel配置使用aop,其实在spring 1.2版本是有api的,基于api配置aop很麻烦,但是也也应该了解下

三、基于spring api方式配置aop

直接上代码:

接口中有两个方法,一个基于aop,会被拦截 ,另外一个不会被拦截。

public interface IAopService {	public void withAop() throws Exception;	public void withoutAop() throws Exception;}

实现类:

public class AopServiceImpl implements IAopService {	private String name="forezp";	public void withAop() throws Exception {		System.out.println("with aop run: " + name);		if (name.trim().length() == 0)			throw new AccountException("name cannot be null");	}	public void withoutAop() throws Exception {		System.out.println("without aop");	}	public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}}

方法前拦截器,实现MethodBeforeAdvice,在制定方法前会被调用。

public class MethodBeforeInterceptor implements MethodBeforeAdvice {	public void before(Method method, Object[] args, Object instance)			throws Throwable {		System.out.println("method invoke:" + method.getName());		if (instance instanceof AopServiceImpl) {			String name = ((AopServiceImpl) instance).getName();			if (name == null)				throw new NullPointerException("name cannot be null");		}	}}

返回后拦截器,执行指定方法后会被调用。

public class MethodAfterInterceptor implements AfterReturningAdvice {	public void afterReturning(Object value, Method method, Object[] args,			Object instance) throws Throwable {		System.out.println("method  " + method.getName() + "had finished and return value-" + value);	}}

异常拦截器,当出现异常时拦截:

public class ThrowsInterceptor implements ThrowsAdvice {	public void afterThrowing(Method method, Object[] args, Object instance,			AccountException ex) throws Throwable {		System.out.println("method" + method.getName() + " throws exception:" + ex);	}	public void afterThrowing(NullPointerException ex) throws Throwable {		System.out.println("the exception:" + ex);	}}

三个拦截器和Servce实现类需要配置到spring中。实际上,spring无法组装,需要借助代理类,把拦截器安装到NameMatchMethodPointcutAdvisor中,把自定义的bean安装到ProxyFactoryBean中,然后组装在一起:

aopMethodBeforeInterceptor
aopMethodAfterInterceptor
aopThrowsInterceptor

单元测试:

 

method invoke:withAop

with aop run: forezp

method withAophad finished and return value-forezp

without aop

SouthEast

扫码关注公众号有惊喜

(转载本站文章请注明作者和出处 )

转载于:https://www.cnblogs.com/forezp/p/9852175.html

你可能感兴趣的文章
数据库的安装步骤
查看>>
关于一些基础的Java问题的解答(七)
查看>>
迭代器模式
查看>>
python写简单的图形界面汉诺塔解题器
查看>>
Wabacus框架
查看>>
安卓titlebar的组合控件使用
查看>>
MYSQL提权的各种姿势
查看>>
网页里如何使用js禁用F12事件
查看>>
Linux 指令
查看>>
头文件与类的区别是什么??
查看>>
PHP的一些 有用但不常用的函数记录
查看>>
Vsftp安装配置实例-red9.0
查看>>
俞敏洪:成功从追女孩开始追一个女孩子背后的人生哲学
查看>>
2014年4月2日
查看>>
自定义代码标签和布局
查看>>
IDEA 笔记汇总
查看>>
filebeat-2-通过kafka队列链接logstash
查看>>
BZOJ2768: [JLOI2010]冠军调查
查看>>
网络性能测试工具Iperf/Jperf解读
查看>>
Python快速教程(转载)
查看>>