Spring的依赖注入原理浅析

最近学习中分析了下spring的控制反转,将思考Mark下

Spring的依赖注入依靠了动态代理和反射

最初我认为Spring的扫包时通过反射实例化了类,但是有个问题一直想不通 就是反射的方式获取实例时有可能会抛出异常,但是在手动获取Spring管理的对象时却不需要捕捉异常,当时懵了半天的我甚至猜测Spring是不是用了什么我不知道的方式实例化对象,后来想了下Spring再厉害也不可能跳出Java的框架

跟了下源码,发现Spring获取Bean 最后几乎都是从map中拿值,就想到了 Spring可能是在启动时就将实例对象缓存,之后都是不断的复用。到这里就想通了 这样只需要在启动时实例化一次,如果有异常 程序在启动阶段就抛异常了,如果启动阶段都实例化了 后续就不需要关心实例化异常的处理了

做了下验证,我另外写了一个缓存 在Spring管理的类中 在方法执行的时候 从缓存里读取上一次缓存的对象并用 == 和当前对象直接比对引用地址 输出比对结果后将当前对象缓存 用于下一次比对。通过页面调用了十几次 发现果然引用地址都一样。之后又测试了下自动注入的对象 引用地址都一样。

在Spring扫包时,将通过注解交给Spring管理的类都初始化,创建代理,将代理缓存。根据网上资料 Spring默认使用JDK自带的方式创建代理,在无法使用JDK自带方式的情况下使用cglib创建代理。

JDK自带的方式只能为接口创建代理 不能为类创建代理。如果要为类创建代理 需要这个类有实现的接口 通过自定义handler的方式可以将代理的invoke改写为调用类的实例 达到间接使用类执行方法的目的。

对于通过注解声明要自动注入的变量,将相应的实例赋值给相应的变量

之后,每次调用被Spring管理的类时,都是从缓存中获取实例对象

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纵马饮白虹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值