Spring笔记3--继续HelloSpring,Context上下文,IOC容器,Bean

如果你还没有看第二章,建议调头!!!( _
Spring笔记2–第一个Spring项目HelloSpring,解决模板java不高亮
上一章,我们已经完成了对Spring配置的结尾工作,这一次,我们真真正正开始来初识Spring

在这之前我们打开官方文档看看Spring的组成

在这里插入图片描述
这张图还是很重要的(doge官方原图)

1、Context理解

我们一般称Spring Context是Spring的上下文,也就是Spring支持环境,负责为我们进行一些参数请求,公共对象解析等等等。你可以认为它是一个大工厂,为我们所需要的生产而做基本准备

2、IOC容器(控制反转理解)

官方是这样子说的 (看不懂)

This chapter covers Spring’s Inversion of Control (IoC) container.

就这样子理解吧,IOC它是一个容器,而且是存放我们实例对象的容器,因为IOC,我们的程序开始被动地接受对象(为什么这么说,以前我们创建一个类的时候,都是通过程序本身来new new new),这样子写如果是水平较高的程序员写可能还好,但是大部分人可能还停留在初级阶段,开发能力欠佳(吐槽我自己用的话),然后自己写出来的代码,这里应该new,那里一个new,如果某一天有个用户认为你某某某做的不好,要改一个业务,然后你看看你“风吹就倒”的代码,改起来难度太大了,没办法,代码耦合度不知不觉就很高了。
所以你开始怨恨这该死的客户,又让你有的忙了!
然后为了摆脱这种尴尬和困扰,一种方法是可以在开发中适当加入一些开发模式(工厂模式啥啥啥的),但是我们是学Spring的,正所谓IOC在手,解耦我有
IOC控制反转就是将代码的实例化及业务修改主动权交给了客户,而程序则被动地接受改变就可了

3、Bean

Bean的话,你就这样子理解。每一个bean都是一个对象,但是每个bean所指代的对象是不是同一个,也就是说他们所指代对象的HashCode是不是一样的,这个我们以后会说

可能有小伙伴一开始学的是注解开发,但是为了能更好地理解Spring及相关知识,我这是先从Spring的配置文件开始,然后才讲注解(两分对比,互补学习)

4、实战

我们一开始不打算用注解开发, 我们先用Spring的配置文件进行开发
(1) 找到java下面的resources文件夹,创建beans.xml文件(名字什么的无所谓,随便取)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我们需要为xml导入一些默认的配置信息

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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">
</beans>

下面这个随便点就可以(强迫症)
在这里插入图片描述
我们在蓝色的java下创建一个包,叫com.spring.study,并在这个包下面创建一个Hello类,写入如下代码

在这里插入图片描述

package com.spring.study;

// 这只是一个镇压这个类所有警告的注解
@SuppressWarnings("all")
public class Hello {
    
    

    public String name;

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }
}

如果我们在beans.xml文件中加上以下代码,也就通关bean标签来实例化我们需要的类

在这里插入图片描述

<bean id="myHello" class="com.spring.study.Hello">
    <property name="name" value="HelloYSJ"/>
</bean>

我们就这个标签来做一个详细的说明,

1、bean:每个bean标签,相当于我们new(实例化)操作
2、id:代码我们为每个bean创建的对象赋予一个唯一标识,等价于我们创建对象的时候对象的名字
3、class:我们bean想要实例化的类的全路径
4、property:,每个property代表我们想修改这个id对象的某个属性,注意这个标签只能嵌入在bean内
5、name:代表这个id的类成员属性名字
6、value:代表你想要为这个第五个(也就是name)这个成员赋什么值,(注意如果你想引用某个bean的id对象,你必须改为ref,而不是value,其他情况均用value)

下面我们创建测试类
在模板中绿色的java里面创建一个test类,名字最好不要叫test或者Test,可以取一个myTest
在这里插入图片描述
由于我们所有的bean都是由xml来配置的,所以我们只能通过xml文件来拿到了

1、第一行代码相当于通过上下文来获取这个IOC容器,而context就是拿到的IOC容器(官方推荐使用ApplicationContext
2、第二行代码通过getBean方法来从IOC容器里面取里面已经实例化好的对象id
3、输出检测
在这里插入图片描述

顺便贴一张ApplicationContext这个类的继承,藏的特别深啊
在这里插入图片描述

可能到这里就有人会问了,name属性是怎么被赋值上去的???

在这里插入图片描述
我们看到第一和第二的地方有片叶子形状的标记
第一片绿色的叶子代表:这个类已经被Spring托管了,Spring帮你实例化
第二片黄色的叶子代表,这个类通过这个方法对某个属性进行注入赋值


第一片叶子说明bean标签已经导入了这个类,那bean是怎么实例化这个类的呢?构造函数,反射???(有兴趣的伙伴可以自己测试一下,这个下节说明)
第二片叶子是代表我们的name属性是通过这个方法注入的,那这个方法名字是不是固定的?,没有这个方法能不能完成注入??我们下面做个小测试

测试

测试一:把setName方法名字改掉
在这里插入图片描述
我们发现出问题了,也就是说这个方法名字固定是setName

如果某个属性叫xxxx,则注入的方法名字必须叫setXxx(属性名首字母大写,如果首字母本来是大写,就不变),我猜测主要是参照了驼峰命名法

测试二:把setName方法直接去掉
在这里插入图片描述
大家也可能猜得到,肯定报错

关于这本节的内容就这么多,有兴趣可以自行多测试测试,了解其中的原理

猜你喜欢

转载自blog.csdn.net/YSJ367635984/article/details/113104647