`
帅得被人看
  • 浏览: 18062 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

摘录-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。

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

Enhancer和MethodInterceptor在CGLib中负责完成代理对象创建和方法截获处理。

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.jar各个版本

    spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...

    AOP流程源码分析-SpringAOP中定义的类图

    AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-...

    Spring5 框架 ---- AOP ---- 代码

    Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 ...

    开发工具 spring-aop-4.3.6.RELEASE

    开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE...

    spring-boot aop

    Spring Boot AOP(面向切面编程)是一种强大的设计模式,它允许我们在不修改现有代码的情况下,插入额外的功能或监控代码。在Spring框架中,AOP主要用于日志记录、事务管理、性能统计等场景。本示例是关于如何在...

    代理模式与动态代理--Spring AOP原理.doc

    代理模式与动态代理--Spring AOP原理.doc

    jar包---Spring Aop AspectJ新增包.rar

    在"jar包---Spring Aop AspectJ新增包.rar"这个压缩文件中,我们可以预见到它包含了用于支持Spring AOP和AspectJ功能的必要库文件。 Spring AOP的实现主要有两种方式:一种是基于代理的AOP(Proxy-based AOP),另...

    jar包---Spring AOP 还需.rar

    这个压缩包可能包含了Spring框架、Spring AOP相关的jar包,例如spring-aop.jar、spring-core.jar、spring-context.jar,以及MyBatis框架的mybatis.jar、mybatis-spring.jar等。确保这些库的版本与你的项目兼容,是...

    spring-aop-jar

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

    spring-aop-5.2.0.RELEASE-API文档-中文版.zip

    赠送jar包:spring-aop-5.2.0.RELEASE.jar; 赠送原API文档:spring-aop-5.2.0.RELEASE-javadoc.jar; 赠送源代码:spring-aop-5.2.0.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.2.0.RELEASE.pom;...

    死磕spring源码系列-SpringAop十分钟快速入门

    死磕spring源码系列-SpringAop十分钟快速入门

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

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

    spring,spring-aop-5.3.22.jar+aop+IDEA本地包

    spring-aop-5.3.22.jar Spring AOP provides an Alliance-compliant aspect-oriented programming implementation allowing you to define method interceptors and pointcuts to cleanly decouple code that ...

    spring-aop-5.0.8.RELEASE-API文档-中英对照版.zip

    赠送jar包:spring-aop-5.0.8.RELEASE.jar; 赠送原API文档:spring-aop-5.0.8.RELEASE-javadoc.jar; 赠送源代码:spring-aop-5.0.8.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.0.8.RELEASE.pom;...

    my-spring.rar-Spring-AOP源码Demo

    在本压缩包"my-spring.rar"中,包含的是一个Spring AOP的源码示例,通过这个示例,我们可以深入理解Spring AOP的工作原理以及如何在实际开发中应用。 AOP的核心概念包括切面(Aspect)、通知(Advice)、连接点...

    Java八股文-Spring AOP

    ### Java八股文-Spring AOP详解 #### 一、AOP概述 面向切面编程(Aspect-Oriented Programming, AOP)是一种编程思想,它作为面向对象编程(Object-Oriented Programming, OOP)的一种补充。传统的面向对象设计模式...

    spring-aop.jar

    spring-aop.jarspring-aop.jarspring-aop.jarspring-aop.jarspring-aop.jarspring-aop.jarspring-aop.jarspring-aop.jarspring-aop.jarspring-aop.jar

    AOP.rar-Spring-AOP源码Demo

    Spring AOP,即Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为应用程序提供了一种模块化和声明式的方式来处理横切关注点,如日志、事务管理、性能监控等。在本"Spring-AOP源码Demo...

    spring-aop-6.0.2.jar

    spring-aop-6.0.2.jar

Global site tag (gtag.js) - Google Analytics