关于代理对象

JDK和cglib

说明:

JDK的代理对象:

JDK的代理是java中jdk自带的代理创建的方式,原则:JDK创建代理对象要求该类必须实现接口(也可以是接口).

Cglib:

要求:可以为任意的类创建代理对象.规则创建的代理对象是目标对象的子类.(效率较慢)

问题:spring中采用哪种创建代理对象的方式?

答:两种都有.

规则:如果目标对象有接口则默认使用JDK,如果目标对象没有接口则使用cglib

 

如果想修改代理对象的创建方式可以添加如下的配置

<aop:config proxy-target-class="true">

代理对象实例化在不同场景有不同方式,以下结合参考内容进行说明。 ### 自定义ProxyFactory方式 通过自定义ProxyFactory创建代理对象时,需要进行一系列配置,包括设置代理的目标源、自定义配置,冻结配置以确保在运行时不被修改,设置预过滤以优化匹配过程,最后通过ProxyFactory获取代理对象。完成所有代理配置后,最终生成代理对象,该对象将在运行时代表原始Bean,增加了指定的AOP功能[^1]。示例代码如下: ```java import org.springframework.aop.framework.ProxyFactory; public class ProxyExample { public static void main(String[] args) { // 创建目标对象 TargetObject target = new TargetObject(); // 创建ProxyFactory ProxyFactory proxyFactory = new ProxyFactory(); // 设置代理的目标源 proxyFactory.setTarget(target); // 可以进行其他自定义配置 // ... // 冻结配置 proxyFactory.setFrozen(true); // 设置预过滤 // ... // 获取代理对象 Object proxy = proxyFactory.getProxy(); } } class TargetObject { public void doSomething() { System.out.println("Doing something..."); } } ``` ### Spring Bean实例化相关 在Spring中,Bean实例化涉及代理对象的实例化。拿到所有带`@Autowired`注解的构造函数后,通过调用`autowireConstructor`来进行实例化,具体则是委托给`ConstructorResolver`类进行处理,包括通过`factoryMethod`创建对象也是委托给这个类。如果没有带`@Autowired`的构造函数,会调用`instantiateBean`方法,利用反射通过无参构造函数去创建对象并返回,这也是大部分对象实例化所走的流程[^2]。 ### 原理 代理对象实例化的原理主要基于AOP(面向切面编程)和反射机制。AOP通过在目标对象的基础上,动态地生成一个代理对象,将切面逻辑(如日志记录、事务管理等)织入到目标对象的方法执行过程中。反射机制则允许在运行时动态地创建对象、调用方法等,Spring在实例化Bean时,通过反射调用构造函数来创建对象。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值