`

AOP实现策略

 
阅读更多

以前有做过一次share,关于动态代理的,因为相关的应用遍及所用的Spring,Hibernate,Junit以及项目中通用的横切功能。看了<Expert one on one J2EE Development without EJB>,这里关于AOP的介绍,有了更全的实现策略,所以摘下来。

 

1. J2SE动态代理


   在JAVA中,实现AOP最显而易见的策略莫过于使用JAVA1.3后引入的动态代理。它使我们可以为一个或多个接口“凭空”地创建实现对象,而不需要预先有一个实现类。如果需要用动态代理实现环绕增强,可以在其中调用必要的拦截器链。拦截器链上的最后一个拦截器将借助反射调用目标对象-如果有目标对象的话。
动态代理最大的好处在于:这时一种标准的JAVA语言特性。最大的局限是:它只能针对接口进行代理,不能针对类。一般情况下,这并不是坏事,因为AOP主要针对业务对象,而业务对象通常应该是放在业务接口之后的。
在针对接口进行代理时,Spring默认地使用动态代理。

 

2.动态字节码生成


   为了针对JAVA类提供代理,我们需要动态代理之外的工具,这就是动态字节码生成。而JAVA的反射与类加载机制都非常开放,因此实现动态字节码生成库并不复杂。其中流行的就有CGLIB(code generation library).在Spring中,如果需要针对类(而不是接口)提供代理,就会用到CGLIB.它可以针对指定的类动态生成一个子类,并覆盖其中的方法,从而实现方法拦截。CGLIB风格的字节码增强被应用在Hibernate2.x版本中,并被证明是一种成熟的技术。不过CGLIB有一个小问题:因为它是通过继承来实现代理的,所以无法为final方法提供代理。

 

3.JAVA代码生成


  也可以生成新的JAVA源码,在其中执行横切性的代码,就像EJB的代码生成策略一样。由于动态待俩和动态字节码生成技术的出现,这种做法正在逐渐退出流行。

 

4.使用定制的类加载器


   如果我们希望对某个类的所有实例进行增强,应该怎么做?或者换个说法,如果我们希望确保某个类的所有实例都被增强过,应该如何去创建这些实例?答案是,我们可以改变new操作符的行为。在这种情况下,可以考虑利用JAVA类加载机制的可扩展性。通过定制一个自制的类加载器,我们可以在一个类被加载时自动对其进行增强。即使用户直接使用用new操作符构造实例,增强仍然会生效。Jboss和AspectWerks都采用这种做法对java类进行增强,具体的增强信息则是在运行时从XML配置文件中读取。这种做法的风险在于:它偏离了java的标准,在某些应用服务器中,这种做法可能会导致问题,因为J2EE服务器需要控制整个类加载的层次体系。

 

5.语言扩展


  如果我们希望把方面当作一等公民来看,就需要一种同时支持AOP和OOP的语言。为了达到这个目的,可以对现有的OO语言进行扩展,AspectJ就对java进行了这样的扩展。

 

 

 

分享到:
评论

相关推荐

    基于AOP策略模式的实现机制

    本文首先将传统基于OOP策略模式的局限性进行分析说明,提出基本的策略模式以及“链式”策略模式基于AOP的具体实现,解决传统策略模式可能出现的代码分散、代码混乱问题;接着进行复杂度方面的实验对比分析;最后分析...

    J2EE应用下基于AOP的抓取策略实现

    本文介绍了如何通过不同的抓取策略从后端系统中获取数据,这是以模块化的方式根据业务需求实现的,同时又不会导致底层服务或Repository层过度膨胀。

    使用Spring AOP实现MySQL数据库读写分离案例分析(附demo)

    分布式环境下数据库的读写分离策略是解决数据库读写性能瓶颈的一个关键解决方案,这篇文章主要介绍了使用Spring AOP实现MySQL数据库读写分离案例分析(附demo),有兴趣的可以了解一下。

    Spring AOP实战 记录日志 下载可以直接使用

    内容概要: 充分利用SpringBoot AOP设计的精妙日志记录方案,实现高效的日志处理策略。此外,我们还支持通过配置文件(yml)精准控制日志开关,并定制AOP切点表达式(Pointcut)。 适用人群: 针对资深Java开发者、...

    40 Spring AOP策略模式使用及示例实战慕课专栏(1)1

    背景在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等,支付可以釆用支付宝、微信、银行卡

    一种基于AOP的软件演化策略设计与实现 (2007年)

    为此介绍了一种基于面向方面的编程(AOP)的软件演化策略,该策略通过使用关注点,向演化系统中注入新的代码,而不改变系统的结构。除此,还介绍了基于此方法的支持软件演化所实现的一个工具,并通过实例对该方法...

    minio使用,poi解析,uid生成工具,策略工厂模式,模板管理完整功能,swagger集成,跨域,异常处理,分页等可用源代码

    3、分页功能:aop实现默认分页赋值。 4、统一结果返回。 5、策略工厂模式:用于不同业务逻辑的实现。 6、uid生成工具。 7、集成swagger在线接口文档。 8、文件上传功能。 9、excel文件解析功能:poi实现。 10、minio...

    深入理解Spring声明式事务:源码分析与应用实践

    这种代理机制基于Spring AOP实现,能够在运行时动态地管理事务的创建、提交或回滚。此外,Spring事务管理器支持多种类型的事务策略,包括不同的传播行为和隔离级别,允许开发者根据具体业务场景选择最合适的事务管理...

    【基于java-ssm】大学生兼职论坛管理系统实现源码+lw+部署文档+讲解

    能学到什么:①了解工厂模式、策略模式、观察者模式等在 Spring 框架中的实现方式;②深入理解 IOC、AOP、代理、切面、循环依赖等设计与实现原理。 阅读建议:本资源旨在通过开发简化版 Spring 框架来学习其原理和...

    高级开发spring面试题和答案.pdf

    AOP实现方式:aop注解或者xml配置;后来工具jar包aspects; aop的属性 事务 事务编码方式: 事务注意事项; 为什么同一个类A调用b方法事务,A方法一定要有事务(编码式的不用) @transaction多个数据源事务怎么指定...

    springboot2+两种方式:(读写分离、动态DataSource、事务懒处理)+sharding-jdbc.zip

    (1)、AbstractRoutingDataSource注册多数据源,AOP实现读写分离、读写源自动切换 (2)、一主多从,多个从库的负载均衡策略可以自定义。(双主多从、故障转移因mysql环境为一主一从,所以代码未实现,不难实现,...

    java拦截器

    拦截是AOP的一种实现策略。 在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。...

    基于spring+springMvc+mybatis 开发的博客样例

    在手写Spring 源码的过程中会摘取整体框架中的核心逻辑,简化代码实现过程保留核心功能,例如:I0C、AOP、Bean生命周期、上下文、作用域、资源处理等内容实现。 能学到什么:①工厂模式、策略模式、观察者模式等都是...

    基于JavaWeb的物业管理系统

    在手写项目的过程中会摘取整体框架中的核心逻辑,简化代码实现过程,保留核心功能,例如:IOC、AOP、Bean生命周期、上下文、作用域、资源处理等内容实现。 适合人群:零编程基础,应届毕业生 能学到什么:①工厂模式...

    蓝色简约风毕业答辩PPT

    在手写Spring 源码的过程中会摘取整体框架中的核心逻辑,简化代码实现过程,保留核心功能,例如:IOC、AOP、Bean生命周期、上下文、作用域、资源处理等内容实现。 适合人群:具备一定编程基础,工作1-3年的研发人员 ...

    Apifox-windows-latest

    适合人群:具备一定编程基础,工作1-3年的研发人能学到什么:@工厂模式、策略模式、观察者模式等都是怎么在Spring中体现的: ②IOC, AOP、代理、切面、循环依赖都是如何设计和实现的。阅读建议:此资源以开发简化版Spring...

    该项目是gradle+springboot+freemarker的项目,是对学生基本信息的增删改查。

    在手写Spring 源码的过程中会摘取整体框架中的核心逻辑,简化代码实现过程,保留核心功能,例如:IOC、AOP、Bean生命周期、上下文、作用域、资源处理等内容实现。 适合人群:具备一定编程基础,工作1-3年的研发人员 ...

    期末课设,基于·Android·开发

    在手写Spring 源码的过程中会摘取整体框架中的核心逻辑,简化代码实现过程,保留核心功能,例如:IOC、AOP、Bean生命周期、上下文、作用域、资源处理等内容实现。 适合人群:具备一定编程基础,工作1-3年的研发人员 ...

    Video基础知识简介

    在手写Spring 源码的过程中会摘取整体框架中的核心逻辑,简化代码实现过程,保留核心功能,例如:IOC、AOP、Bean生命周期、上下文、作用域、资源处理等内容实现。 适合人群:具备一定编程基础,工作1-3年的研发人员 ...

Global site tag (gtag.js) - Google Analytics