如果你还没有看第二章,建议调头!!!( _ )
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方法直接去掉
大家也可能猜得到,肯定报错
关于这本节的内容就这么多,有兴趣可以自行多测试测试,了解其中的原理