Spring源码分析:实现AOP(转载)

简介:
这两天一直在读spring1.2的AOP实现源码,AOP实现原理说起来很简单,对于实现业务接口的对象使用java代理机制实现,而对于一般的类使用cglib库实现,但spring的实现还是比较复杂的,不过抓住了本质去看代码就容易多了。发现一篇04年写的 《spring源码分析:实现AOP》,倒是不用自己再写了,04年的时候已经有很多人研读过spring的源码,而那时的我还在学校,对java半懂不懂的状态,就算到现在也不敢说真的懂了,继续学习、努力。文章如下:

   
我的问题
       为了完成公司应用开发平台的设计,这几天一直在研究Spring的扩展机制。Spring的核心无疑是BeanFactory, ApplicationContext和AOP。在“Spring AOP编程”教程的例子中,是由ProxyFactoryBean来实现的。问题来了,普通的bean和FactoryBean的配置完全是一样的。那 么,BeanFactory是如何区分普通的Bean和用作Proxy的FactoryBean的?ProxyFactoryBean又是怎样实现AOP 功能的?(本文还很不完善,我会继续修改。)
 
FactoryBean的职责
        FactoryBean在Spring中被当成一种特殊的bean,通过实现FactoryBean接口进行扩展。FactoryBean的职责是:
        l.封装了创建对象或查找对象的逻辑。
       2.提供了一个中间层,用于支持AOP。

       我们来看一个LocalStatelessSessionProxyFactoryBean的例子。首先,定义Stateless EJB的代理,id为ejbServiceProxy:
       <bean id="ejbServiceProxy" class="LocalStatelessSessionProxyFactoryBean">
           <property name="jndiName">     
              <value>myEjb</value>
           </property>
           <property name="businessInterface">
              <value>com.mycompany.MyBusinessInterface</value>
           </property>
      </bean>
 
      然后,再将这个业务逻辑服务对象注入客户程序:
     <bean id="myAction" class = "samples.myAction">
         <property name="myService">
             <ref bean="ejbServiceProxy"/>
         </property>
     </bean>

     这样,客户程序并不知道myService的实现细节,Spring使用FactoryBean完成了两者之间的解耦。
 
准备代码分析环境
     1. 安装Eclipse和Spring IDE。
     2. 下载Spring framework源代码,并导入Eclipse。
     3. 在类路径创建log4j.properties配置文件,设置如下:
             log4j.rootLogger=DEBUG, stdout
             log4j.appender.stdout=org.apache.log4j.ConsoleAppender
             log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
             log4j.appender.stdout.layout.ConversionPattern=%d{SSS} %p %c{2} - %m%n
     4. 编写TestCase,跟踪Console窗口的debug信息。

FactoryBean源代码分析
       如果bean实现了FactoryBean接口,BeanFactory将把它作为一个bean工厂,而不是直接作为普通的bean。正常情况下, BeanFactory的getBean("bean")返回FactoryBean生产的bean实例,如果要返回FactoryBean本身的实例, 使用getBean("&bean")的调用方式。
       在分析ProxyFactoryBean之前,我们先分析BeanFactory,它是Spring Framework的基础。我们看看它是如何分别处理普通的Bean和FactoryBean的。
 
  BeanFactory分析
 
     BeanFactory类图
 
       如以上的类图所示,XmlBeanFactory继承了AbstactBeanFactory抽象类。AbstactBeanFactory类中使用了 Template Method设计模式,其中的模板方法为getBeanDefinition()和createBean()两个抽象方法。其中 AbstractAutowireCapableBeanFactory类实现了getBeanDefinition()方法, DefaultAutowireCapableBeanFactory类实现了getBeanDefinition()方法。当调用getBean()方 法时,AbstractBeanFactory类定义的逻辑分别调用了这两个模板方法。

     BeanFactory类的调用顺序
       我们暂时不使用ApplicationContext,以简化分析过程。我在这里使用了“Spring AOP编程”的例子,请参照该教程阅读。首先,编写测试用例,代码如下:

            public class AopTest extends TestCase {
                  XmlBeanFactory factory = null;
                  protected void setUp() throws Exception {
                       super.setUp();
                       InputStream is = new FileInputStream("testaop.xml");
                       factory = new XmlBeanFactory(is);
                  }
                  public void testGetBean() {
                       Bean bean = (Bean)factory.getBean("bean");
                       assertNotNull(bean);
                       bean.theMethod();
                  }
            }
 
       1. 首先,XmlBeanFactory使用XmlBeanDefinitionReader读入testaop.xml配置文件,后者用 XmlBeanDefinitionParser和DefaultXmlBeanDefinitionParser进行分析,从中得到 BeanDefinition的信息,并保存在XmlBeanDefinitionReader的BeanDefinitionRegistry变量里。
       2. 客户程序调用getBean方法时,AbstractBeanFactory首先使用transFormedBeanName方法分析传入的Bean名称,判断客户程序需要FactoryBean本身,还是它所创建的Bean对象。
       3. 接下来,如果bean被定义为singleton模式,AbstractBeanFactory调用createBean方法根据 BeanDefinition信息实例化bean类,然后将该bean实例传给getObjectForSharedInstance方法并返回 getObjectForSharedInstance的返回对象。GetObjectForSharedInstance方法摘要如类图所示,首先判断 bean是否继承了FactoryBean。如果是,返回FactoryBean的getObject方法(下节我将详细分析使用 ProxyFactoryBean如何实现AOP);如果不是,返回bean对象。
       4. 如果bean被定义为prototype模式,每次客户程序请求都会生成新的bean实例,因此,createBean方法直接实例化bean对象并返回。
 
  ProxyFactoryBean如何实现AOP

     ProxyFactoryBean类图
       FactoryBean接口如下图所示,共有三个方法getObject,getObjectType,和isSingleton。ProxyFactoryBean实现了FactoryBean接口,它的相关类图如下:
 

 
     实现AOP的过程
       如上图所示,ProxyFactoryBean类继承了AdvisedSupport类,后者继承了ProxyConfig类并定义了操作advisor 和interceptor的接口,以支持AOP。当BeanFactory实例化ProxyFactoryBean时,根据配置文件的定义将关于 advice,pointcut,advisor,所代理的接口和接口实现类的所有信息传给ProxyFactoryBean。
       当客户程序调用BeanFactory的getBean方法时,ProxyFactory使用JdkDynamicAopProxy实例化 BeanImpl类,并用JdkDynamicAopProxy的invoke方法执行advice。至于执行advice的时机,由 ProxyFactoryBean调用RegexpMethodPointcutAdvisor进行判断。
文章转自庄周梦蝶  ,原文发布时间5.17
目录
相关文章
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
1041 0
|
监控 安全 Java
Spring AOP实现原理
本内容主要介绍了Spring AOP的核心概念、实现机制及代理生成流程。涵盖切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)等关键概念,解析了JDK动态代理与CGLIB代理的原理及对比,并深入探讨了通知执行链路和责任链模式的应用。同时,详细分析了AspectJ注解驱动的AOP解析过程,包括切面识别、切点表达式匹配及通知适配为Advice的机制,帮助理解Spring AOP的工作原理与实现细节。
1863 13
|
XML Java 数据格式
《深入理解Spring》:AOP面向切面编程深度解析
Spring AOP通过代理模式实现面向切面编程,将日志、事务等横切关注点与业务逻辑分离。支持注解、XML和编程式配置,提供五种通知类型及丰富切点表达式,助力构建高内聚、低耦合的可维护系统。
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
902 70
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。
1035 1
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
1662 0
|
Java API 微服务
微服务——SpringBoot使用归纳——Spring Boot中的切面AOP处理——Spring Boot 中的 AOP 处理
本文详细讲解了Spring Boot中的AOP(面向切面编程)处理方法。首先介绍如何引入AOP依赖,通过添加`spring-boot-starter-aop`实现。接着阐述了如何定义和实现AOP切面,包括常用注解如`@Aspect`、`@Pointcut`、`@Before`、`@After`、`@AfterReturning`和`@AfterThrowing`的使用场景与示例代码。通过这些注解,可以分别在方法执行前、后、返回时或抛出异常时插入自定义逻辑,从而实现功能增强或日志记录等操作。最后总结了AOP在实际项目中的重要作用,并提供了课程源码下载链接供进一步学习。
1951 0
|
Java 开发者 微服务
微服务——SpringBoot使用归纳——Spring Boot中的切面AOP处理——什么是AOP
本文介绍了Spring Boot中的切面AOP处理。AOP(Aspect Oriented Programming)即面向切面编程,其核心思想是分离关注点。通过AOP,程序可以将与业务逻辑无关的代码(如日志记录、事务管理等)从主要逻辑中抽离,交由专门的“仆人”处理,从而让开发者专注于核心任务。这种机制实现了模块间的灵活组合,使程序结构更加可配置、可扩展。文中以生活化比喻生动阐释了AOP的工作原理及其优势。
720 0