`
234390216
  • 浏览: 10240522 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:462974
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1776154
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1398883
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:395178
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:680216
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:531239
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1185383
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:469072
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:151540
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:68387
社区版块
存档分类
最新评论

Spring Aop(一)——Aop简介

阅读更多

1 Aop简介

AOP的全称是Aspect Oriented Programming,翻译成中文是面向切面编程。它的主要思想是在程序正常执行的某一个点切进去加入特定的逻辑。AOP框架中对AOP支持最完整的是Aspectj,Spring Aop是基于Aspectj实现的专门针对于Spring自身支持的Aop,它的功能没有Aspectj那么完整,它只作用于Spring bean容器中bean对象的某个方法的执行。正如Spring官方文档所描述的那样,Spring Aop与Aspectj不是竞争关系,而是相互补充、相互完善的这么一个关系。

1.1 基本原理

AOP框架的基本原理基本上都是通过代理的方式对目标对象达到切入式的切面编程的效果,Spring Aop也不例外。Spring Aop只能对它自身bean容器中定义的bean对象进行代理,这算是Spring Aop的一个限制,如果你的项目中不使用Spring的IOC,使用Spring的Aop显然是有点不那么合适的。Spring Aop中使用的代理有两种方式,一种是Jdk的动态代理,另一种是基于CGLIB实现的代理,当我们的bean对象实现了某一接口后,Spring默认将采用Jdk动态代理,当我们的bean对象没有实现接口时,默认将采用CGLIB代理,Spring也支持我们在bean对象实现了接口时也强制的使用CGLIB代理。Spring的Bean容器在初始化bean对象的时候就会判断对应的bean是否需要进行切面编程,即是否需要对其进行代理,如果需要,则初始化的时候就会把它初始化为一个代理对象。下面基于Jdk来看一个简单的示例,假设我们定义了如下这样一个代理工厂,其可以将一个普通的对象基于其实现的接口利用Jdk动态代理机制生成对应的代理对象。具体代码和说明请看如下代码,其中我们可以在目标对象执行特定的方法时加入一些特定的处理逻辑。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyFactory {

	private static ProxyFactory instance = new ProxyFactory();
	private ProxyFactory() {}
	
	public static ProxyFactory getInstance() {
		return instance;
	}
	
	@SuppressWarnings("unchecked")
	public <T> T create(final T t) {
		return (T) Proxy.newProxyInstance(t.getClass().getClassLoader(), t.getClass().getInterfaces(), new InvocationHandler() {

			/**
			 * 当使用创建的代理对象执行其中的方法时,都会转换为调用与代理对象绑定的InvocationHandler对象的invoke方法,
			 * 这样我们就可以在这个方法里面对调用情况进行一些特定的处理逻辑
			 */
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				System.out.println("正在调用的方法是:" + method);
				//1、加入对调用方法前的处理逻辑
				//...
				Object result = null;
				try {
					//2、正常的调用目标对象的目标方法
					result = method.invoke(t, args);
					//3、可加入正常调用后的处理逻辑
					//...
				} catch (Exception e) {
					//4、可加入目标对象的方法调用抛出异常后的处理逻辑
					//..
				} finally {
					//5、可加入目标对象的方法执行完成后的处理逻辑,此逻辑不论是否抛出异常都将执行
				}
				return result;
			}
			
		});
	}
	
}

以下是基于上述代码进行的一个简单示例,具体如下,有兴趣的朋友也可以自己试一试。

@Test
public void test1() {
	ProxyFactory proxyFactory = ProxyFactory.getInstance();
	//创建一个实现了UserService接口的对象
	UserService userService = new UserServiceImpl();
	//创建一个基于userService对象的代理对象
	UserService proxy = proxyFactory.create(userService);
	//调用代理对象的某个方法
	User user = proxy.findById(1);
	System.out.println(user);
}

上述只是一个简单的示例,只是为了说明Spring Aop的大体原理,实际上Spring Aop的代理逻辑比这个要复杂很多,在初始化bean后它需要判断该bean是否需要创建代理对象,这通常都是BeanPostProcessor的功能。有兴趣的读者可以参考一下DefaultListableBeanFactory的preInstantiateSingletons方法,了解一下Spring bean的初始化过程,更详细的内容请参考AbstractApplicationContext.refresh方法。

1.2 基本概念

在了解Spring Aop的用法前,我们需要先了解一下Spring Aop中的一些重要概念,这些概念的英文名称摘自Spring的官方文档,这些术语在本系列文章中出现时可能会以原始英文的形式出现。

  • Aspect:切面类,是面向切面编程的主体类,用以定义Pointcut和Advice这样的对应关系。
  • Join Point:切入点,程序运行的某一个点,比如执行某个方法,在Spring AOP中Join Point总是表示一个方法的执行。
  • Advice:切面类Aspect需要在Join Point处执行的操作。Advice的类型主要包括Before、After和Around三种。包括Spring在类的很多AOP框架都会把Advice以类似于Interceptor(拦截器)的形式进行封装,然后在每个Join Point的前后都可以包含一个Interceptor链,即可以进行多个操作处理。
  • Pointcut:用来定义匹配的Join Point的,它是一个表达式。它往往会跟Advice绑定在一起,用以指定需要在Pointcut表达式匹配的Join Point执行的操作。采用Pointcut表达式来匹配Join Point是AOP中一个非常重要的概念,它能够使得我们的Advice能够比较独立,即一个Advice可以同时服务于多个JoinPoint。Spring AOP默认采用Aspectj(AOP的始祖)的Pointcut表达式。
  • Introduction:用来声明额外的方法和属性。可以给目标对象引入新的接口及其实现。例如可以使用Introduction让一个bean实现isModified接口。
  • Target Object:目标对象,表示Aspect正在处理的对象。因为Spring AOP是基于运行时代理实现的,所以这个对象永远都是一个代理对象。
  • Aop Proxy:由AOP框架创建的一个代理对象。在Spring AOP中这个代理对象将由JDK代理(基于接口)或CGLIB代理(基于Class)生成。
  • Weaving:表示编织的意思。用以将切面类Aspect与目标对象联系在一起的这么一个动作,所形成的结果就是在Pointcut所指定的Join Point执行时由Aspect对目标对象执行特定的Advice。AOP框架中的Weaving动作可以发生在编译时、类装载时和运行时,Spring AOP的Weaving动作是发生在运行时。

1.2.1 Advice类型

Advice的类型主要有Before、After和Around三种,Before作用于JoinPoint执行前,After作用于JoinPoint执行后(After类型还可以细分),Around则可作用于JoinPoint执行前后,且JoinPoint的执行需要在Around类型的Advice中进行调用,具体如下:

  • Before:Before类型的Advice将在Join Point执行前运行,除非在运行时抛出一个异常,否则Before类型的Advice不会阻止Join Point的运行。
  • After Return:After Return类型的Advice将在Join Point正常执行完成(return)后运行,即Join Point的运行没有抛出对外的异常后返回的。
  • After Throwing:After Throwing类型的Advice将在Join Point抛出对外的异常后运行。
  • After (finally):After类型的Advice不论Join Point的执行结果如何都将运行。
  • Around:Around类型的Advice将围绕一个Join Point执行,它既可以在Join Point执行前执行特定的逻辑,也可以在Join Point执行后执行特定的逻辑,还可以控制Join Point是否执行、抛出异常、修改返回值等。

Around Advice的功能是最强大的,所有其它Advice能够满足的需求使用Around Advice也都能够满足。但是Spring官方并推荐我们大量的使用Around Advice,而是使用最简单最能满足我们需要的那个Advice。比如如果你只是想简单的在Join Point执行完成后根据返回值来更新缓存,那你使用After Return Advice将比使用Around Advice更合适。这不但能够使你的程序更加的简单,也能减少你出错的机会(使用Around Advice时需要用户自己调用JoinPoint的proceed方法,让JoinPoint继续运行),更能减少程序运行的复杂度。

Spring AOP目前只支持对方法执行这样的JoinPoint进行特定的Advice处理,更确切的来说是只支持对Spring Bean容器里面的bean定义的方法执行进行切入特定的处理逻辑。如果你需要对属性的访问也进行拦截,也执行特定的Advice,那么你可以考虑使用Aspectj。还有一点需要注意的是切面类不会被自动代理,不能作为其它切面类作用的目标类,即使你配置的Poincut目标对象能包含对应的Aspect也不行。

(注:本文是基于Spring4.1.0所写)

0
0
分享到:
评论

相关推荐

    五、Spring源码分析——Spring Aop

    《Spring AOP 源码分析》 在深入探讨Spring AOP之前,我们先要理解AOP(面向切面编程)的基本概念。AOP是一种编程范式,它将关注点分离,使得我们可以将横切关注点(如日志、事务管理、安全检查等)与业务逻辑解耦...

    征服Spring AOP—— Schema

    本文将深入探讨“Spring AOP——Schema”,这是Spring AOP的一种配置方式,通过XML schema定义切面和通知。 首先,我们需要理解AOP的基本概念。面向切面编程是一种编程范式,旨在提高软件的模块化程度,将关注点...

    Spring 入门案例——AOP

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来实现横切关注点,如日志、事务管理、性能监控等。本入门案例将帮助你理解并掌握Spring AOP的基本概念和使用方法。 在...

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    Spring AOP 是一种面向切面编程的技术,它允许我们在不修改源代码的情况下,对应用程序的特定部分(如方法调用)进行增强。在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态...

    spring aop依赖jar包

    现在,我们回到主题——"springaop依赖的jar包"。在Spring 2.5.6版本中,使用Spring AOP通常需要以下核心jar包: - `spring-aop.jar`:这是Spring AOP的核心库,包含了AOP相关的类和接口。 - `spring-beans.jar`:...

    征服Spring AOP—— @AspectJ

    在IT行业中,Spring框架是Java企业级应用开发的首选,而Spring AOP(面向切面编程)则是其核心特性之一,用于实现横切关注点的模块化,如日志、事务管理等。@AspectJ是Spring AOP的一种注解驱动方式,它极大地简化了...

    spring-aop-jar

    "spring-aop-jar"这个主题涉及到Spring框架中的核心组件之一——Spring AOP。这里我们将深入探讨Spring AOP、相关jar文件以及它们在实际开发中的作用。 首先,我们来看一下提供的文件: 1. aopalliance.jar:这是一...

    Spring aop 性能监控器

    在IT行业中,Spring AOP(面向切面编程)是一种强大的工具,它允许我们在不修改代码的情况下,对应用程序的特定部分进行拦截和增强。这在性能监控、日志记录、事务管理等方面尤为有用。本篇文章将深入探讨如何使用...

    spring之AOP(动态代理)

    在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点分离,将横切关注点(如日志、事务管理、权限检查等)与核心业务逻辑解耦。AOP的核心概念是切面、通知、连接点、切入点和织入。在...

    spring-aop.jar

    《深入解析Spring AOP框架——以spring-aop.jar为例》 Spring AOP,全称Aspect Oriented Programming(面向切面编程),是Spring框架的核心部分之一,它为Java开发者提供了强大的面向切面的编程能力。本文将围绕...

    springioc和spring aop

    Spring框架是Java开发中不可或缺的一部分,它通过提供两种核心特性——控制反转(IoC)和面向切面编程(AOP)来简化应用的构建。理解并掌握这两种技术对于任何Java开发者来说都至关重要。 **控制反转(IoC)**,也...

    使用SpringAop使用Oracle数据权限控制

    Spring AOP(面向切面编程)是一个强大的工具,常用于实现业务逻辑中的横切关注点,如日志、事务管理以及我们的案例——数据权限控制。本篇将深入探讨如何结合Spring AOP和Oracle数据库来实现精细化的数据权限控制。...

    spring AOP myeclipse 完整代码

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要组成部分。它是对传统面向对象编程(OOP)的一种补充,旨在解决业务逻辑中的横切关注点,如日志记录、事务管理、权限控制等。...

    springAOP-dome

    在这个名为"springAOP-dome"的实例中,我们将探讨如何利用Spring AOP实现一个简单的日志记录功能,以作为入门学习。 首先,了解AOP的基本概念是必要的。面向切面编程是一种编程范式,旨在解决程序中的横切关注点,...

    SpringAOP测试Demo

    在"SpringAOP测试Demo"中,我们通常会涉及以下几个核心概念和操作: 1. **切面(Aspect)**:切面是关注点的一个模块化,它包括了连接点、通知、目标对象、织入和引入。在Spring AOP中,切面通常由一个或多个注解的...

    Spring——aop

    在Java开发领域,Spring框架是不可或缺的一部分,它提供了许多强大的功能,其中AOP(面向切面编程)是其重要特性之一。AOP允许开发者将关注点分离,使得业务逻辑代码与系统服务如日志、事务管理等可以独立处理,提高...

    9Spring AOP 盗梦空间之四——Around

    "9Spring AOP 盗梦空间之四——Around"这个标题暗示我们将深入探讨Spring AOP中的一个关键概念——环绕通知(Around Advice)。环绕通知是Spring AOP中功能最全面的通知类型,它提供了对方法执行前、执行后以及异常...

    7Spring AOP盗梦空间之二——获得返回值AfterReturnning

    通过阅读《Spring AOP盗梦空间之二——获得返回值AfterReturnning》这篇博文(链接:https://garrincha.iteye.com/blog/2111779),你可以获得更详细的实践指导和示例代码。同时,结合提供的压缩包文件"Spring_AOP_...

    spring aop 源码解析

    首先,我们需要知道Spring AOP的核心概念——切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和代理(Proxy)。切面是封装了特定关注点的模块,如日志或事务管理。通知是在特定连接点...

    struts2+spring集成bug——使用AOP时可能遇到的问题分析

    Struts2作为MVC框架负责控制层,而Spring则提供了全面的依赖注入(DI)和面向切面编程(AOP)功能。将这两者集成可以实现强大的应用架构。然而,集成过程中可能会遇到一些问题,尤其是当涉及到Spring的AOP时。 首先...

Global site tag (gtag.js) - Google Analytics