写在前面
写过java
的都知道:所有的对象都必须创建;或者说:使用对象之前必须先创建。而使用ioc
之后,你就可以不再手动创建对象,而是从ioc
容器中直接获取对象。
就好像我们无需考虑对象的销毁回收一样,因为java
垃圾回收机制帮助我们实现了这个过程;而ioc
则是让我们无需考虑对象的创建过程,由ioc
容器帮我们实现对象的创建、注入等过程。
控制反转
Spring ioc简介spring ioc容器
在Spring
框架中的核心组件只有三个:Core、Context
和Bean
。它们构建起了整个Spring
的骨骼架构,没有它们就不可能有AOP、Web
等特性功能。
如果说在三个核心中再选出一个核心,那就非
Bean
莫属了。可以说,Spring
就是面向Bean
的编程,Bean
在Spring
中才是真正的主角。
Spring
为何如此流行?你会发现Spring
解决了一个非常关键的问题,它可以让你对对象之间的关系转而用配置文件来管理,或者注解,也就是它的依赖注入机制。而这个注入关系在一个叫Ioc
的容器中管理。Ioc
容器就是被Bean
包裹的对象。Spring
正是通过把对象包装在Bean中从而达到管理这些对象及做一些列额外操作的目的。
spring ioc初始化
spring ioc容器工作原理
核心组件协同工作
三大核心组件BeanFactory与ApplacationContext的区别
IOC
中最核心的接口是Beanfactory
提供IOC
的高级服务,而ApplicationContext
是建立在BeanFactory
基础之上提供抽象的面向应用的服务。
3种注入方式
在Spring
框架中,依赖注入(DI)
的设计模式是用来定义对象彼此间的依赖。使用xml
配置bean
的情况下,它主要有两种类型:
-
Setter
方法注入 -
构造器注入
当然,有了注解之后,使用注解的方式更加方便快捷。即自动装配功能实现属性自动注入(@autowire)
。
写到这里,让我想起了最近在牛客网上看的一道选择题了:
<pre class="hljs objectivec" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; padding: 15px; margin-top: 0px; margin-bottom: 20px; line-height: 1.42857; word-wrap: normal; color: rgb(101, 123, 131); background-color: rgb(246, 246, 246); border: 1px solid rgb(204, 204, 204); border-radius: 0px; text-size-adjust: none; word-break: break-word !important;"> 下面有关spring的依赖注入,说法错误的是?
A、依赖注入通常有如下两种:设置注入和构造注入:
B、构造注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入
C、当设值注入与构造注入同时存在时,先执行构造注入,再执行设值注入
D、设值注入是指IoC容器使用属性的setter方法来注入被依赖的实例。这种注入方式比较简单、直观</pre>
牛客网给出的答案是选C,不过网友们好像对答案有不同的意见哈。查看网友评论及答案
原理解析
Spring
的代码还真是不好读,分得太细了,文字也是难以描述出来,看了别人有关的博客,贴了好多代码,画了好多ER
图来描述关键接口或类之间的关系。这么一篇这么长文章下来,大家也未必会认真读代码,看ER图,干脆也不跟风了。就贴了一点在我看来特关键的代码,嘿嘿。
context的初始化过程
当运行ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
构造方法ClassPathXmlApplicationContext(String configLocation)
调用了this(new String[] {configLocation}, true, null);
, 该构造方法具体代码如下。
refresh()方法
从时序图来看启动上述初始化
容器初始化时序图配套Ximnd学习导图下载地址
java思维导图:https://gitee.com/1341541819.com/java_xmind/tree/master
写在最后
欢迎关注、喜欢、和点赞后续将推出更多的思维导图教程,敬请期待。
欢迎关注我的微信公众号免费获取更多更全的学习资源,视频资料,技术干货!
资源领取方式
公众号回复“学习”,拉你进程序员技术讨论群,干货资源第一时间分享。
公众号回复“视频”,领取800GJava视频学习资源。
820G资源
公众号回复“全栈”,领取1T前端,Java,产品经理,微信小程序,Python等资源合集大放送。
java
python
机器学习
产品经理
接近1T资源
公众号回复“慕课”,领取1T慕课实战学习资源。
php
python
测试
后端
前端
前端
微信
1061G资源
公众号回复“实战”,领取750G项目实战学习资源。
750实战资源
公众号回复“面试”,领取8G面试实战学习资源。
传智面试讲解
8G面试资源
网友评论