AOP解析2-代理的创建

通过自定义配置完成了对AnnotationAwareAspectJAutoProxyCreator类型的自动注册,那么这个类到底做了什么工作来完成AOP的操作呢?首先我们看看AnnotationAwareAspectJAutoProxyCreator类的层次结构

在类的层级中,我们看到AnnotationAwareAspectJAutoProxyCreator实现了BeanPostProcessor接口,而实现BeanPostProcessor后,当Spring加载这个Bean时会在实例化前调用其postProcessAfterInitialization方法,而对于AOP逻辑的分析也由此开始。

public Object postProcessAfterInitialization(Object bean, String beanName)
    throws BeansException
{
    if(bean != null)
    {
        //根据给定的bean的class和name构建出个key,格式:beanClassName_beanName
       Object cacheKey = getCacheKey(bean.getClass(), beanName);
        if(!earlyProxyReferences.containsKey(cacheKey))
           //如果它适合被代理,则需要封装指定bean
          return wrapIfNecessary(bean, beanName, cacheKey);
    }
    return bean;
}
protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey)
   {
       //如果已经处理过
      if(beanName != null && targetSourcedBeans.containsKey(beanName))
           return bean;
       //无需增强
      if(Boolean.FALSE.equals(advisedBeans.get(cacheKey)))
           return bean;
       //给定的bean类是否代表一个基础设施类,基础设施类不应代理,或者配置了指定bean不需要自动代理
      if(isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName))
       {
           advisedBeans.put(cacheKey, Boolean.FALSE);
           return bean;
       }
       //如果存在增强方法则创建代理
      Object specificInterceptors[] = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
       //如果获取到了增强则需要针对增强创建代理
       if(specificInterceptors != DO_NOT_PROXY)
       {
           advisedBeans.put(cacheKey, Boolean.TRUE);
           //创建代理
           Object proxy = createProxy(bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
           proxyTypes.put(cacheKey, proxy.getClass());
           return proxy;
       } else
       {
           advisedBeans.put(cacheKey, Boolean.FALSE);
           return bean;
       }
   }  

函数中我们已经看到了代理创建的雏形。当然,真正开始之前还需要经过一些判断,比如是否已经处理过或者是否是需要跳过的bean,而真正创建代理的代码是从getAdvicesAndAdvisorsForBean开始的。

创建代理主要包含了两个步骤:

(1)获取增强方法或者增强器;

(2)根据获取的增强进行代理。

时间: 2024-11-15 22:21:24

AOP解析2-代理的创建的相关文章

反射真的慢么?动态代理会创建很多临时class?

问题1.反射真的慢么?2.动态代理会创建很多临时class?3.属性通过反射读取怎么实现的?当我们在IDE中编写代码的时候,打一个点号,IDE会自动弹出对应的属性和方法名,当我们在debug的时候,IDE会将方法运行时方法内局部变量和外部实例上属性的值都展示出来,spring中的IOC和AOP,以及一个RPC框架中,我们反序列化,consumer的代理,以及provider的调用都会用到java的反射功能,有人说使用反射会慢,那么到底慢在哪里呢? 反射反射使JAVA语言有了动态编译的功能,也就是

深入理解Spring AOP之二代理对象生成

深入理解Spring AOP之二代理对象生成 spring代理对象 上一篇博客中讲到了Spring的一些基本概念和初步讲了实现方法,当中提到了动态代理技术,包含JDK动态代理技术和Cglib动态代理 动态代理这部分我有过一篇博客介绍:动态代理,想深入了解的朋友能够看一看,再回想一下,Spring中怎样区分採用JDK动态代理和CGlib动态代理: 假设目标对象的实现类实现了接口.Spring AOP 将会採用 JDK 动态代理来生成 AOP 代理类: 假设目标对象的实现类没有实现接口,Spring

用spring aop实现动态代理的例子

下面由我来给大家展示用spring aop实现动态代理的例子(电脑打印) 下面就看一下具体的代码: 先定义一个打印机的接口 1 package aop007_ComPrint; 2 3 public interface Print { 4 5 public void ColorPrint(); //彩色打印 6 public void WhitePrint(); //黑白打印 7 } 然后定义两个实现类,分别实现彩色打印和黑白打印 1 package aop007_ComPrint; 2 3 p

AOP jdk动态代理

一: jdk动态代理是Spring AOP默认的代理方法.要求 被代理类要实现接口,只有接口里的方法才能被代理,主要步骤是先创建接口,接口里创建要被代理的方法,然后定义一个实现类实现该接口,接着将被代理对象注入到一个中间对象,中间对象实现InvocationHandler接口,实现该接口可以在 被代理对象调用它的方法前后插入一些代码.Proxy.newProxyInstance()能利用中间对象来生产代理对象. 二: (1)创建接口: package net.wang.aop; /** * 被代

Spring——AOP(动态代理)

以例子说明: 一.创建两个接口,并创建各自的实现类,实现类在XML文件中进行配置,并在测试类中取得各实现类的实例 二.创建代理类,实现InvocationHandler接口 (1)声明实际代理的对象 1 private Object obj;  (2)创建绑定的方法,通过传入的实际代理对象创建对应的代理对象 1 /** 2 * @param obj 3 * @return 代理对象 4 */ 5 public Object bind(Object obj) 6 { 7 this.obj = ob

Spring AOP JDK动态代理与CGLib动态代理区别

静态代理与动态代理 静态代理 代理模式 (1)代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. (2)静态代理由 业务实现类.业务代理类 两部分组成.业务实现类 负责实现主要的业务方法,业务代理类负责对调用的业务方法作拦截.过滤.预处理,主要是在方法中首先进行预处理动作,然后调用业务实现类的方法 例子 /** * 定义一个账户接口 * @author Administrator */ public interface Count { //

springIOC源码解析之Bean的创建

上一篇讲到了beanFactory的配置文件的解析和beanFactory的创建,都集中到了obtainFreshBeanFactory();这一句代码里了,本篇主要讲bean的创建过程 public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. pr

Spring AOP --JDK动态代理方式

我们知道Spring是通过JDK或者CGLib实现动态代理的,今天我们讨论一下JDK实现动态代理的原理. 一.简述 Spring在解析Bean的定义之后会将Bean的定义生成一个BeanDefinition对象并且由BeanDefinitionHolder对象持有.在这个过程中,如果Bean需要被通知切入,BeanDefinition会被重新转换成一个proxyDefinition(其实也是一个BeanDefinition对象,只不过描述的是一个ProxyFactoryBean).ProxyFa

Spring框架IOC容器和AOP解析

主要分析点: 一.Spring开源框架的简介  二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面向切面编程(AOP)和事务管理配置  一.Spring开源框架的简介  Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来.它是为了解决企业应用开