Spring 学习笔记1 —— IOC容器 I (IOC容器、DI依赖注入)

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
1 Spring IoC容器和Bean简介

=====================================================================================

1.1 了解IOC


1.1.1 Bean

什么是Bean?

在Spring中,构成应用程序主干并由Spring IoC容器管理的对象称为bean。Bean是由Spring

IoC容器实例化组装管理的对象。

显然这里的Bean并不只是那些实体类,即POJO。这里的Bean包含了所有的由Spring托管的Java类的实例!

Bean及其之间的依赖关系反映在容器使用的配置元数据(Configuration Metadata)中。

这里的配置元数据往往用.xml文件或者Java注解 (annotation)实现。我们马上就能看到具体的例子。

1.1.2 IOC容器

帮助我们管理Java对象的容器就称为Spring IOC 容器。

org.springframework.beansorg.springframework.context包是Spring框架的IoC容器的基础

  • 它们的maven依赖为

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(顾名思义,一个通过类路径,一个通过系统文件名)。

1.2.1 配置元数据

Spring IoC容器使用一种形式的配置元数据。此配置元数据表示您作为应用程序开发人员如何告诉Spring容器在应用程序中实例化,配置和组装对象。

这里元数据Meta data实际上就是表明对象如何创建,如何组装,如何管理。(否则Spring怎么按照我们的意愿创建出我们想要的对象?)。

  • 配置的形式

  • XML

这也是最传统的方式,也就是所谓的XML配Bean的方式

  • 注解(annotation)

基于注释的配置:Spring 2.5引入了对基于注释的配置元数据的支持。

  • 基于Java的配置

(这个从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">

其中id是定义单个Bean的唯一唯一表示,class要使用全限定名(除非用到后面的别名)。

1.2.2 实例化容器

为了学习笔记的精简化,完整的代码不在这里提供,具体代码可参见 这篇博客。

ApplicationContext context = new ClassPathXmlApplicationContext(“beans.xml”);

1.2.3 使用容器

我们可以使用ApplicationContext来访问有IOC容器托管的对象。

  • 方式1

T getBean(String name)

User user = (User)applicationContext.getBean(“user”);

  • 方式2

T getBean(String name, Class requiredType)

User user = applicationContext.getBean(“user”,User.class);

总结,方式一使用类型强制转换,方式二使用类型做参数,错误可以在编译时期发现,更好。

1.3 Bean


1.3.1 Bean 的命名

  • 命名约定

使用驼峰式命名,如accountManager, accountService,userDao,loginController

  • Bean 的标识

使用id来唯一标识bean,name是别名,可以有多个。@Bean

注解也可以提供别名。

  • 不提供名称

为什么允许这样做,可以猜想就类似于匿名内部类一样,无需提供名称。

这和后面的自动装配有关。

1.3.2 Bean 的实例化

这部分和类的初始化相关,暂且不谈

1.4 依赖(Dependencies)


典型的企业应用程序不包含单个对象(或Spring术语中的bean)。即使是最简单的应用程序,也有一些对象可以协同工作,以呈现最终用户视为一致的应用程序。

简单的说,就是对象的构成很多时候是依赖其他多个对象的。比如, Zoo实例依赖TigerLion实例;UserService实例依赖UserDao或者UserMapper实例。

使用DI原理,代码更加简洁,当为对象提供依赖项时,去耦会更有效。该对象不查找其依赖项,并且不知道依赖项的位置或类。

也就是,程序员不在负责对象的创建和组装,而仅仅负责对象的提供,创建及组装(DI)由Spring 完成。

综上, DI实际上是实现IOC的一种措施。

1.4.1 依赖注入

1.4.1.1 Constructor 注入

实体类

package com.jsy.pojo;

public class Zoo {

Tiger tiger;

Lion lion;

public Zoo(Tiger tiger, Lion lion) {

this.tiger = tiger;

this.lion = lion;

}

}

  • 构造函数参数解析匹配通过使用参数的类型进行

上述的例子中LionTiger类不是通过继承关联的,则不存在潜在的歧义,配置生效,

以下的例子来自官方

  • type 属性
  • index 属性
  • name 属性
1.4.1.2 Setter 注入

基于设置器的DI是通过在调用无参数构造函数或无参数static工厂方法以实例化您的bean之后,在您的bean上调用setter方法来完成的。

  • 必须具有无参构造器

  • 必须有set函数,函数名为 set+属性名(首字母大写)

1.4.1.3 Factory方法注入

这种方法与上述两种原理是一致的,区别不大。

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属性外)

1.4.1.4 循环依赖问题

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注入。

1.4.2 依赖注入的细节

setter注入使用

constructor 注入使用元素

下面主要是setter注入解释。

1.4.2.1 真值注入

1.4.2.2 Bean注入

1.4.2.3 空串和NULL

下面的例子来自Kuangshen.

1.4.2.4 数组注入

西游记

红楼梦

水浒传

1.4.2.5 List注入

听歌

看电影

爬山

1.4.2.6 Map注入

最后

在面试前我整理归纳了一些面试学习资料,文中结合我的朋友同学面试美团滴滴这类大厂的资料及案例
Spring 学习笔记1 —— IOC容器 I (IOC容器、DI依赖注入)_第1张图片

Spring 学习笔记1 —— IOC容器 I (IOC容器、DI依赖注入)_第2张图片
由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

大家看完有什么不懂的可以在下方留言讨论也可以关注。

觉得文章对你有帮助的话记得关注我点个赞支持一下!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

水浒传

1.4.2.5 List注入

听歌

看电影

爬山

1.4.2.6 Map注入

最后

在面试前我整理归纳了一些面试学习资料,文中结合我的朋友同学面试美团滴滴这类大厂的资料及案例
[外链图片转存中…(img-wgDPaKUp-1714752805934)]

[外链图片转存中…(img-QeqGjml6-1714752805935)]
由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

大家看完有什么不懂的可以在下方留言讨论也可以关注。

觉得文章对你有帮助的话记得关注我点个赞支持一下!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

你可能感兴趣的:(程序员,spring,学习,笔记)