`
shiyixunsyx
  • 浏览: 3462 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Spring AOP实现原理

 
阅读更多

Spring AOP实现原理自己总结:

Spring AOP实现原理:

用到了AOP的动态代理模式:

1.画图:把切面画出来

2.举个例子进行说明

方法正在运行的了,前面加个日志,记录方法开始了,在方法后面加个日志记录方法结束了。

3:实现原理:

 

切面的意义何在?

 

首先根据上例,假设我们实现了一个通用的权限检查模块,那么就可以在这层切面上进

行统一的集中式权限管理。权限检查模块可以和业务逻辑代码分离,而业务逻辑组件则无需关心权限方面的问题。系统大部分有权限检查模块,用的时候直接拿来用这个切面。也就是说,通过切面,我们可以将系统中各个不同层次上的问题隔离开来,实现统一集约式处理。各切面只需集中于自己领域内的逻辑实现。 

这一方面使得开发逻辑更加清晰,专业化分工更加易于进行;另一方面,由于切面的隔

离,降低了耦合性,我们就可以在不同的应用中将各个切面组合使用,从而使得代码可重用

性大大增强。 

JDKProxy

如果是面向接口的动态代理的实现,即JDKProxy,其代理对象必须是某个接口的实现,使用java.lang.reflect.Proxy类根据一个被代理对象产生一个代理对象userDAOProxy,通过Proxy类的调用静态方法newProxyInstance,根据要实现的接口来产生(这里为UserDao接口)也就是说接口里面有哪些方法,我生成的代理里面就有哪些方法);以及实现java.lang.reflect.InvocationHandler接口,实现invoke方法实现方法的截获处理,也就是在方法的前后加上业务逻辑。

当你想在多个方法前后加上业务逻辑的时候,可以使用动态代理,更加灵活方便,代码的可重用性大大的提高。

根据一个被代理对象通过Proxy静态方法newProxyInstance产生代理对象:

newProxyInstance里面的参数解释:

第一个参数是说与被代理对象有同一个ClassLoader,

第二个参数说产生的代理对象实现的那个接口应该与被代理对象实现同一个接口(UserDao),也可以这样写new Class[]{UserDao.class}。

第三个参数:当产生代理之后,调用代理里面的方法后要用哪个Handler进行处理。

LogIntercepter li = new LogIntercepter();

li.setTarget(userDAO);//引入一个被代理的对象userDAO

UserDao userDAOProxy = (UserDao) Proxy.newProxyInstance(userDAO.getClass().getClassLoader(),userDAO.getClass().getInterfaces(), li);

实现InvocationHandler接口 :

public Object invoke(Object proxy, Method m, Object[] args)

throws Throwable {

beforeMethod();//在方法前面添加业务逻辑,也就是日志

m.invoke(target, args);//target Method方法所属的对象,表示被代理对象动态调用invoke()

return null;

}

CGLibProxy

如果没有实现接口,也没有关系,可以用CGLib(面向Class)实现AOP

CGLibProxyJDKProxy的代理机制基本类似,只是其动态代理的代理对象并非某个接口的实现,而是针对目标类扩展的子类。话句话说JDKProxy返回动态代理类,是目标类所实现接口的另一个实现版本,它实现了对目标类的代理(如同UserDAOProxyUserDAOImp的关系),而CGLibProxy返回的动态代理类,则是目标代理类的一个子类(代理类扩展了UserDaoImpl

EnhancerMethodInterceptorCGLib中负责完成代理对象创建和方法截获处理。

Enhancer创建代理对象,实现MethodInterceptor接口,实现intercept方法来进行方法截取处理。

(CGLib (Code Generation Library) 字节码类库是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。Hibernate用它来实现PO字节码的动态生成。CGLib 比 Java 的 java.lang.reflect.Proxy 类更强的在于它不仅可以接管接口类的方法,还可以接管普通类的方法。)

 
JDK动态代理和CGLIB字节码生成的区别
 * JDK动态代理只能对实现了接口的类生成代理,而不能针对类.
 * CGLIB针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
   因为是继承,所以该类或方法最好不要声明成final

JDK代理是不需要以来第三方的库,只要JDK环境就可以进行代理,它有几个要求

实现InvocationHandler
* 使用Proxy.newProxyInstance产生代理对象

* 被代理的对象必须要实现接口

CGLib 必须依赖于CGLib的类库,但是它需要类来实现任何接口代理的是指定的类生成一个子类,覆盖其中的方法,是一种继承

AOP的应用:

做权限的检查:设计完备的权限管理组件,完成以往需要大费周折才能完成的权限判定功能。

但是目前还没有一个完善的实现,一方面是因为权限检查过于复杂多变,不同的业务逻辑中的权限判定逻辑可能多种多样;另一方面,就目前的AOP应用的粒度而言,“权限管理”作为一个切面显得过于庞大,需要进一步设计,设计复杂,实现难度大。

,做日志,做审计,做性能,做事务的处理。项目里面主要用在了声明式的事务处理上。

分享到:
评论

相关推荐

    spring aop实现原理

    NULL 博文链接:https://zhang-yingjie-qq-com.iteye.com/blog/319927

    Spring框架系列(9) - Spring AOP实现原理详解之AOP切面的实现.doc

    Spring AOP 实现原理详解之 AOP 切面的实现 Spring AOP 是基于 IOC 的 Bean 加载来实现的,本文主要介绍 Spring AOP 原理解析的切面实现过程。AOP 切面的实现是将切面类的所有切面方法根据使用的注解生成对应 ...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    Spring框架中的AOP模块使用了动态代理来实现AOP概念。Spring AOP允许开发者定义切面,并在这些切面中指定拦截的方法。Spring AOP支持不同的代理策略,包括JDK动态代理和CGLIB代理。如果被代理的类没有实现接口,...

    Spring AOP实现机制

    **Spring AOP 实现机制详解** Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的...

    Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现.doc

    Spring AOP,全称Aspect Oriented Programming,即面向切面编程,是Spring框架的一个重要特性,用于实现横切关注点的模块化。AOP通过在运行时动态地将代码编织到一起,使得我们可以在不修改原有业务代码的情况下,对...

    Spring AOP面向方面编程原理:AOP概念

    ### Spring AOP面向方面编程原理:AOP概念详解 #### 一、引言 随着软件系统的日益复杂,传统的面向对象编程(OOP)逐渐暴露出难以应对某些横切关注点(cross-cutting concerns)的问题。为了解决这一挑战,面向方面编程...

    反射实现 AOP 动态代理模式(Spring AOP 的实现 原理) - Java 例子 -

    本文将深入探讨Spring AOP的实现原理,以及如何使用反射来实现动态代理模式。 首先,我们需要了解AOP的基本概念。AOP的核心思想是切面,它包含两个主要部分:切点(Pointcut)和通知(Advice)。切点定义了在程序...

    Spring AOP实现原理解析

    Spring AOP实现原理解析 Spring AOP(Aspect-Oriented Programming)是一种面向方面编程的技术,它可以将公共行为封装到一个可重用模块中,以减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可...

    JDK动态代理 spring aop 的原理

    总的来说,JDK动态代理是Spring AOP实现的基础,它允许我们在运行时动态创建代理对象,实现对方法调用的拦截和增强。Spring AOP则在此基础上提供了更高级的抽象,让我们可以方便地定义和管理切面,从而实现更灵活的...

    spring aop 自定义注解保存操作日志到mysql数据库 源码

    2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑实现 (需要知道原理的请看spring aop源码,此处不做赘述) 3、可在现有源码上快速进行功能扩展 4、spring boot,mybatis,druid,spring aop的使用

    深入浅析Spring 的aop实现原理

    AOP(Aspect-Oriented Programming,面向方面编程)是一种编程范式,旨在提供更好的模块化和组织代码的方式,...通过理解Spring AOP的实现原理,开发者可以更好地设计和优化应用程序,提升系统架构的灵活性和可扩展性。

    简单spring aop 例子

    本示例将简要介绍如何在Spring应用中实现AOP,通过实际的代码示例帮助理解其工作原理。 首先,我们要理解AOP的核心概念。AOP是一种编程范式,它允许开发者定义“切面”(Aspects),这些切面封装了特定的关注点,如...

    Spring Aop的底层实现技术 --- Jdk动态代理原理

    Spring AOP 的底层实现技术 --- Jdk 动态代理原理 JDK 动态代理是 Spring AOP 的底层实现技术,允许开发者在运行期创建接口的代理实例。在 JDK 1.3 以后,JDK 动态代理技术提供了实现 AOP 的绝好底层技术。JDK 动态...

    spring ioc和aop原理流程图(详细)

    6. **代理(Proxy)**:Spring AOP通过动态代理实现切面的织入。对于接口,使用JDK动态代理;对于非接口类,使用CGLIB动态代理。 Spring的IOC和AOP机制使得开发者能够更专注于业务逻辑,而不是繁琐的依赖管理和横切...

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

    在深入理解 Spring AOP 的源码时,需要熟悉 Spring IoC 的工作原理,以及 AOP 相关的概念,如切点表达式、通知类型等。了解这些基础知识可以帮助我们更好地掌握 Spring AOP 的实现细节。在分析源码时,可以参考作者...

    Java动态代理(Spring Aop原理)

    在Spring框架中,AOP(面向切面编程)就是基于Java动态代理来完成的,用于实现横切关注点,如日志、事务管理等。这篇博客的文章链接虽然没有给出具体内容,但我们可以根据Java动态代理和Spring AOP的基本概念来深入...

    SpringAop学习笔记以及实现Demo

    4. **事务管理Demo**:结合Spring的事务管理特性,展示了如何使用AOP实现数据库操作的事务控制。 通过这些示例,你可以深入理解Spring AOP的工作原理,掌握其配置和使用方式,从而在实际项目中灵活地应用切面编程,...

    手写springAop框架3.zip

    二、Spring AOP实现原理 1. **代理模式**:Spring AOP采用动态代理技术实现,主要有两种代理方式:JDK动态代理和CGLIB代理。JDK代理用于接口类,CGLIB代理则针对无接口或非代理接口的类。 2. **切面(Aspect)**:...

    Spring aop 性能监控器

    本篇文章将深入探讨如何使用Spring AOP实现性能监控器,并通过源码分析来理解其工作原理。 首先,我们要了解AOP的核心概念——切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和织入...

    Spring AOP的底层实现技术

    可以帮助我们更好地理解其工作原理,例如,可以查看`org.springframework.aop.framework.ProxyFactoryBean`、`org.springframework.aop.aspectj.autoproxy.AspectJProxyFactoryBean`、`org.springframework.aop....

Global site tag (gtag.js) - Google Analytics