《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!
1 Spring IoC容器和Bean简介
=====================================================================================
1.1 了解IOC
什么是Bean?
在Spring中,构成应用程序主干并由Spring IoC容器管理的对象称为bean。Bean是由Spring
IoC容器实例化,组装和管理的对象。
显然这里的Bean并不只是那些实体类,即POJO。这里的Bean包含了所有的由Spring托管的Java类的实例!
Bean及其之间的依赖关系反映在容器使用的配置元数据(Configuration Metadata)中。
这里的配置元数据往往用.xml
文件或者Java注解 (annotation
)实现。我们马上就能看到具体的例子。
帮助我们管理Java对象的容器就称为Spring IOC 容器。
在
org.springframework.beans
和org.springframework.context
包是Spring框架的IoC容器的基础
org.springframework
spring-core
5.2.9.RELEASE
org.springframework
spring-context
5.2.9.RELEASE
1.2 容器概述
org.springframework.context.ApplicationContext
接口代表Spring IoC容器,并负责实例化,配置和组装Bean。
容器通过读取配置元数据获取有关要实例化,配置和组装哪些对象的指令。配置元数据以XML,Java批注或Java代码表示。
注意ApplicationContext
是一个接口,通常创建ClassPathXmlApplicationContext
或的实例 FileSystemXmlApplicationContext
(顾名思义,一个通过类路径,一个通过系统文件名)。
Spring IoC容器使用一种形式的配置元数据。此配置元数据表示您作为应用程序开发人员如何告诉Spring容器在应用程序中实例化,配置和组装对象。
这里元数据Meta data实际上就是表明对象如何创建,如何组装,如何管理。(否则Spring怎么按照我们的意愿创建出我们想要的对象?)。
配置的形式
XML
这也是最传统的方式,也就是所谓的XML配Bean的方式
基于注释的配置:Spring 2.5引入了对基于注释的配置元数据的支持。
(这个从Spring3.0开始支持)
基于注解和Java的配置算是Spring后期发展的产物,这里我们就以最传统的XML为例。
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> 其中 为了学习笔记的精简化,完整的代码不在这里提供,具体代码可参见 这篇博客。 ApplicationContext context = new ClassPathXmlApplicationContext(“beans.xml”); 我们可以使用 T getBean(String name) User user = (User)applicationContext.getBean(“user”); T getBean(String name, Class requiredType) User user = applicationContext.getBean(“user”,User.class); 总结,方式一使用类型强制转换,方式二使用类型做参数,错误可以在编译时期发现,更好。 1.3 Bean 使用驼峰式命名,如 使用 注解也可以提供别名。 为什么允许这样做,可以猜想就类似于匿名内部类一样,无需提供名称。 这和后面的自动装配有关。 这部分和类的初始化相关,暂且不谈 1.4 依赖(Dependencies) 典型的企业应用程序不包含单个对象(或Spring术语中的bean)。即使是最简单的应用程序,也有一些对象可以协同工作,以呈现最终用户视为一致的应用程序。 简单的说,就是对象的构成很多时候是依赖其他多个对象的。比如, 使用DI原理,代码更加简洁,当为对象提供依赖项时,去耦会更有效。该对象不查找其依赖项,并且不知道依赖项的位置或类。 也就是,程序员不在负责对象的创建和组装,而仅仅负责对象的提供,创建及组装(DI)由Spring 完成。 综上, DI实际上是实现IOC的一种措施。 实体类 package com.jsy.pojo; public class Zoo { Tiger tiger; Lion lion; public Zoo(Tiger tiger, Lion lion) { this.tiger = tiger; this.lion = lion; } } 上述的例子中 (以下的例子来自官方) 基于设置器的DI是通过在调用无参数构造函数或无参数static工厂方法以实例化您的bean之后,在您的bean上调用setter方法来完成的。 必须具有无参构造器 必须有set函数,函数名为 set+属性名(首字母大写) 这种方法与上述两种原理是一致的,区别不大。 public class ExampleBean { // a private constructor private ExampleBean(…) { … } // a static factory method; the arguments to this method can be // considered the dependencies of the bean that is returned, // regardless of how those arguments are actually used. public static ExampleBean createInstance ( AnotherBean anotherBean, YetAnotherBean yetAnotherBean, int i) { ExampleBean eb = new ExampleBean (…); // some other operations… return eb; } } 实例(非静态)工厂方法可以以基本上相同的方式使用(除了使用factory-bean属性代替使用class属性外) package com.jsy.pojo; public class A { B b; public void setB(B b) { this.b = b; } } package com.jsy.pojo; public class B { A a; public void setA(A a) { this.a = a; } } 使用构造函数注入,则可能会创建无法解决的循环依赖方案 一种可能的解决方案是编辑某些类的源代码,这些类的源代码由设置者而不是构造函数来配置。或者,避免构造函数注入,而仅使用setter注入。换句话说,尽管不建议这样做,但是您可以使用setter注入配置循环依赖关系。 简单的说,如果出现循环依赖,必须使用setter注入。 setter注入使用 constructor 注入使用 下面主要是setter注入解释。 下面的例子来自Kuangshen. 西游记 红楼梦 水浒传 听歌 看电影 爬山 在面试前我整理归纳了一些面试学习资料,文中结合我的朋友同学面试美团滴滴这类大厂的资料及案例 大家看完有什么不懂的可以在下方留言讨论也可以关注。 觉得文章对你有帮助的话记得关注我点个赞支持一下! 水浒传 听歌 看电影 爬山 在面试前我整理归纳了一些面试学习资料,文中结合我的朋友同学面试美团滴滴这类大厂的资料及案例 [外链图片转存中…(img-QeqGjml6-1714752805935)] 大家看完有什么不懂的可以在下方留言讨论也可以关注。 觉得文章对你有帮助的话记得关注我点个赞支持一下!id
是定义单个Bean的唯一唯一表示,class
要使用全限定名(除非用到后面的别名)。1.2.2 实例化容器
1.2.3 使用容器
ApplicationContext
来访问有IOC容器托管的对象。
1.3.1 Bean 的命名
accountManager, accountService,userDao,loginController
。
id
来唯一标识bean,name
是别名,可以有多个。@Bean
1.3.2 Bean 的实例化
Zoo
实例依赖Tiger
,Lion
实例;UserService
实例依赖UserDao
或者UserMapper
实例。
1.4.1 依赖注入
1.4.1.1 Constructor 注入
Lion
、Tiger
类不是通过继承关联的,则不存在潜在的歧义,配置生效,
1.4.1.2 Setter 注入
1.4.1.3 Factory方法注入
1.4.1.4 循环依赖问题
1.4.2 依赖注入的细节
1.4.2.1 真值注入
1.4.2.2 Bean注入
1.4.2.3 空串和NULL
1.4.2.4 数组注入
1.4.2.5 List注入
1.4.2.6 Map注入
最后
由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!
1.4.2.5 List注入
1.4.2.6 Map注入
最后
[外链图片转存中…(img-wgDPaKUp-1714752805934)]
由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!