`
wuhuajun
  • 浏览: 93883 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

jdk代理,cgib代理和spring后处理bean的关系

 
阅读更多

最近项目中使用InstantiationAwareBeanPostProcessorAdapter后处理bean的方式发布springbean到osgi容器,但是这里有个方法

@Override

public Object postProcessAfterInitialization(Object bean, String beanName)

第一个参数是Object

这个参数可能是目标对象也可能是代理对象。

现在我要获取原来对象类级别上的一个注解,而且需要通过反射对该对象进行调用 不管是不是代理对象都要完成这样的功能。

 

通过测试如果是jdk动态代理获取到的代理对象都是$Proxy+一个数字形式 获取不到目标对象上的注解

              如果是cglib形式的代理,代理对象上面都是带有cglib字样的形式  能获取到目标对象的注解

 

通过反射都能正确调用到代理对象上的方法。

这样的话如果是jdk代理那么首先要获取到目标对象让后通过目标对象来获取注解就ok了。

 

 

猜测(有待验证):jdk代理直接通过代理形式 和目标对象没有关系 所以获取不到目标对象上的注解。

而cglib代理是通过继承的方式 所有注解也继承了下来这样生成的目标对象可以获取注解。

 

如何通过代理对象获取到目标对象可以通过

  • jinnianshilongnian写的

AopTargetUtils.java这个工具类 测试过可以获取到。

 

0
7
分享到:
评论
2 楼 wuhuajun 2013-08-18  
代理  包装了一层  通过反射调用目标对象
所以如果目标对象的类上面有@Test注解 代理对象的类上面没有这个注解可以获取。
1 楼 jd2bs 2013-08-18  
这个跟具体实现相关 jdk proxy是动态生成$Proxy0.class, 反编译后是:
public final class $Proxy0 extends Proxy implements IA{
    static { 
    try { 
      
      m1 = Class.forName("demo.IA").getMethod("a", new Class[0]); 
      
    } catch (NoSuchMethodException localNoSuchMethodException) { 
      throw new NoSuchMethodError(localNoSuchMethodException.getMessage()); 
    } catch (ClassNotFoundException localClassNotFoundException) { 
      throw new NoClassDefFoundError(localClassNotFoundException.getMessage()); 
    } 
  }

public $Proxy0(InvocationHandler paramInvocationHandler) { 
    super(paramInvocationHandler); 
  }

  public final void a() { 
    try { 
      this.h.invoke(this, m1, null); 
      return; 
    } catch (RuntimeException localRuntimeException) { 
      throw localRuntimeException; 
    } catch (Throwable localThrowable) { 
      throw new UndeclaredThrowableException(localThrowable); 
    }
  } 

}

显然代理类本身extends Proxy,它没有提供访问目标对象方法m1的public方法

相关推荐

    spring 中特殊bean用法

    在Spring框架中,Bean是核心概念,它代表了应用程序中的对象,这些对象由Spring容器管理其生命周期和依赖关系。特殊Bean用法主要涉及Spring提供的多种高级特性,包括但不限于工厂方法、 prototype scope、AOP代理、...

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

    它实现了 `BeanPostProcessor` 接口,会在 Bean 初始化后对其进行处理,生成代理对象。`AbstractAutoProxyCreator` 会查找 Spring 上下文中的 `Advisor`(顾问),每个 `Advisor` 包含一个 `Advice`(通知)和一个 `...

    四、Spring源码分析——动态代理

    例如,可以查看`org.springframework.aop.framework.JdkDynamicAopProxy`和`org.springframework.aop.framework.CglibAopProxy`这两个类,它们分别实现了JDK和CGLIB代理。`InvocationHandler`接口的实现类`...

    Spring的静态代理和动态代理

    静态代理是在编译时就已经确定代理对象和真实对象的关系。在Spring中,我们可以通过自定义接口并实现该接口的两个类:一个是真实对象,另一个是代理对象。代理对象在调用真实对象的方法之前或之后,可以添加额外的...

    示例代码:spring使用【XXXPostProcessor】添加bean定义,修改bean定义、代理bean

    在Spring框架中,`XXXPostProcessor` 是一种关键的组件,它允许我们在bean实例化、初始化前后进行定制化的处理。这种处理方式对于扩展Spring的功能,实现特定的逻辑或拦截bean的行为至关重要。`BeanPostProcessor` ...

    使用ImportBeanDefinitionRegistrar、JDK代理、FactoryBean模拟mybatis原理.zip

    在Spring框架中,`ImportBeanDefinitionRegistrar`、JDK代理和`FactoryBean`是三个关键的概念,它们在实现复杂的应用逻辑和扩展Spring的功能时起到重要作用。让我们深入理解这些概念,并结合MyBatis的原理,来探讨...

    模拟spring aop【一】基于jdk动态代理实现的aop

    - Spring AOP提供了`DefaultAdvisorAutoProxyCreator`,它可以自动为匹配的Bean创建JDK代理。 - 切面(Aspect)是Spring AOP的核心,它封装了通知(Advice),通知定义了切面的逻辑。例如,我们可以创建一个`...

    springAop默认代理方式.zip

    Spring AOP,全称Spring Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、性能监控等。在Spring AOP中,...

    利用反射和代理实现简单的Spring

    6. **生命周期管理**:Spring提供了一套完整的bean生命周期管理机制,包括初始化、销毁方法的调用,以及`InitializingBean`和`DisposableBean`接口的自动处理。 通过以上步骤,我们可以实现一个简化版的Spring框架...

    ssm整合jar包(jdk1.8和spring4).rar_jdk1.8 jar包_jdk1.8 spring jar_spri

    - 配置Spring的ApplicationContext,定义bean的定义和依赖关系。 - 集成Spring MVC,配置DispatcherServlet,设置视图解析器和控制器。 - 配置Struts2,包括struts.xml配置文件,设定Action和结果页面。 - 集成...

    使用代理实现简易的spring aop功能

    在这个方法中,我们可以添加预处理(before advice)和后处理(after advice)逻辑。例如,我们可以在方法调用前记录日志,方法调用后进行结果验证。 4. **创建代理**:使用`java.lang.reflect.Proxy....

    springAOP配置动态代理实现

    3. **通知类型**:Spring支持五种不同类型的通知:前置通知(Before)、后置通知(After)、返回后通知(After Returning)、异常后通知(After Throwing)和环绕通知(Around)。 4. **切点表达式**:切点表达式...

    spring 的动态代理详解

    Spring框架利用动态代理技术为Bean提供了横切关注点(如事务管理、日志记录等)的集成方式,这极大地简化了应用程序的开发过程。本文将深入探讨Spring中动态代理的机制、关键概念以及其实现细节。 #### 动态代理...

    spring动态代理

    Spring提供了两种动态代理的方式:JDK动态代理和CGLIB代理。 1. JDK动态代理: JDK动态代理基于Java的反射机制,适用于目标对象实现了接口的情况。在Java.lang.reflect包下,有两个关键类:InvocationHandler和...

    解释Spring中的Aop代理

    Spring支持两种类型的AOP代理:JDK动态代理和CGLIB代理。 - JDK动态代理:基于Java反射API实现,适用于接口代理。如果目标对象实现了至少一个接口,Spring会使用JDK动态代理创建一个代理对象,该代理对象在调用...

    JavaEE spring自动实现AOP代理

    - 创建代理对象时,Spring使用`java.lang.reflect.Proxy`类的静态方法`newProxyInstance()`,传入目标对象的类加载器、接口数组以及InvocationHandler实现,后者处理实际的调用逻辑。 2. **CGLIB代理**: - 如果...

    Spring[applicationContext.xml]灵活性代理

    1. JDK动态代理:当目标bean实现了至少一个接口时,Spring会使用Java的反射API创建一个代理类,该类实现了目标bean的所有接口,并在调用接口方法时插入增强代码。 2. CGLIB代理:如果目标bean没有实现任何接口,...

    spring相关面试问题.docx

    4. **BeanPostProcessor**:如果 Bean 实现了 BeanPostProcessor 接口,Spring 在初始化阶段会调用其方法,允许自定义的后处理逻辑,如属性校验、拦截器等。 5. **初始化回调**:Spring 会调用 Bean 的初始化方法,...

Global site tag (gtag.js) - Google Analytics