java spring的依赖注入原理是什么?详细解析

随着科技发展的越来越快,新技术也在不断涌现。大家纷纷开始学习新的知识,尤其是对于java的学习更是如此。今天为大家介绍一些java知识,也就是java spring的依赖注入原理是什么?一起来了解一下吧。

首先说一下,spring的扫包时通过反射实例化了类,但是反射的方式获取实例时有可能会抛出异常,在手动获取spring管理的对象时却不需要捕捉异常,思考spring如何实例化对象,后来觉得spring不可能跳出Java的框架。

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

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

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

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

最后,对于通过注解声明要自动注入的变量,将相应的实例赋值给相应的变量。每次调用被spring管理的类时,都是从缓存中获取实例对象。

以上就是关于java spring的依赖注入原理是什么的主要内容了。并且为大家详细解析了。如果你对java架构师感兴趣,想要了解更多java知识,敬请关注奇Q工具网。

推荐阅读:

java中spring依赖注入的要点有哪些?详细图解

java spring依赖注入有哪些缺点?升级版新特征是什么?

java spring依赖注入方式有哪几种?有什么区别?