一、创建Spring项目
这里使用Maven方式创建Spring项目,分为以下三步:
- 创建一个普通的Maven项目
- 添加spring框架支持
- 添加启动类
注:这里创建的是一个spring的core项目,不是web项目,只需要main方法,不需要tomcat。
1.创建一个Maven项目
当java文件夹和pom.xml文件都是蓝色的,说明Maven初始化好了。
如果这两个文件是灰色的,说明还在加载,可以手动重新加载。
2.添加Spring依赖
正常情况下,在项目中的pom.xml中添加Spring依赖即可。添加的依赖有两个,分别是spring-context即spring上下文和spinrg-beans即管理对象的模块。
外部库那里还可以看到添加这两个依赖之后自动产生了其他的,这是因为spring-context实现依赖于其他几个。
配置代码片段是固定的,可以在代码仓库上专门建一个仓库村这样的代码片段。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>
所以,目前pom.xml文件应该长这个样子:
由于maven仓库在国外,所以我们在添加框架支持的过程中 很可能遇到一直刷新或者下载不下来的问题,所以为了方便学习,这里我配置了maven的国内源。下边是我的配置过程。
Maven国内源配置
说明:因为我的本地没有settings.xml文件,所以这里直接创建的新文件,如果本地已经有,需要对文件进行检查。
如果本地没有,就创建一个同名文件,并将此文件中的内容复制到里边。
文件之后我以资源的形式上传
注意:设置需要两次,一个是当前项目,一个新项目。
检查过程:
未存在,创建,并检查是不是配置了国内源
3.添加启动类
最后在创建好的项目的java文件夹下创建一个启动类。
要求:包含一个main方法
启动类的作用其实也就是为了后边获取Bean对象做准备。
二、存Bean
Java中的对象在Sping项目中叫做Bean。
存Bean分为两步,分别
- 创建Bean
- 将Bean注册到Spring容器中
1.创建一个Bean
一般是创建一个实体类例如Student类、User类,这个模板/类产生的对象交由spring管理。
2.将Bean注册到容器中
具体的注册方法就是在resources库下添加配置文件spring-config.xml(名字可自行定义,但推荐使用这个),除了固定的配置代码,再使用bean标签以<id=? class=?>的形式声明Bean:
<bean id="student" class="Student"></bean>
其中这里的id是bean的名称即类名的小写,class是bean的路径:包名+类名即类在java文件夹下的路径。一般是"com.xxx.……",这里只是演示没有分级,所以直接写类名即可。
固定代码:
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
所以本例中的spring-config.xml文件应该这样写:
如果飘红,尝试使用enter+alt+enter方式解决。【本文件是xml的不是java的,idea不一定能正确识别】
三、取Bean并使用Bean
取Bean分为三步:
- 获取Spring上下文对象
- 通过Spring上下文对象获取指定Bean对象
- 使用Bean对象
注:以下操作均是再启动类的Main方法中进行
1.创建Spring上下文对象
创建Spring上下文对象一般使用ApplicationContext这个类,除此以外还可以使用BeanFactory这个类,两者略有区别,稍后再谈。
使用ApplicationContext创建上下文对象:
注意:这里有个参数是之前定义过的配置文件,一定保证名字没写错!
【再次提醒:别高估自己的拼写能力=_=】
2.获取指定的Bean对象
可以看到,获取指定Bean常见的三种方式:
- id
- 类型即类名.class
- id+类名.class
这里更推荐使用第三种。虽然前两种更加简洁,但是当Bean对象有多份的时候,存多次就会出错,稍后举例说明。这里先用起来。
这样,就拿到指定Bean对象了。
此操作中注意事项:
- Bean的id要一一对应
- getBean虽然有很多重载,但是注意上边提到的前两种一个参数的和另一个两个参数的区别:当有一个类型被重复注册到spring-config.xml中,只能使用根据id+类型的方式获取指定Bean对象了。
3.使用Bean对象
这里我们的Student类只写了一个sayHi方法,所以这里使用bean对象的实例就只是用这个sayHi方法进行演示:
运行这个main方法:
这样就算大功告成了~
如果出现类似这样的报错IOException parsing XML document from class path resource [spring-cnofig.xml],但是有感觉自己没错,尝试检查classes文件下是不是有,JVM是不是运行的原来的缓存。
ApplicationContext和BeanFactory区别
观察下边的代码及运行结果:
操作:
-
再定义一个实体类Teacher,并注册到Spring容器中
-
按照推荐方法取出Student类型的bean
-
只调用student1的sayHi方法
观察运行结果
可以发现,当Spring容器中管理多个类型的Bean时,采用这两种方式运行结果不同。通过看源代码的层级结构,我们可以知道:ApplicationContext是继承于BeanFactory的。
总结:
联系:从继承关系而言,ApplicationContext和BeanFactory都是Spring容器的两个顶级的接口,并且ApplicationContext是继承于BeanFactory的;从功能角度而言,ApplicationContext和BeanFactory都有获取Spring上下文对象的功能。
区别:从功能角度而言,前者除了继承后者所有功能外还具有独特特性,添加了对国际化、资源访问及事件传播等方面的支持;从性能角度而言,前者是一次性加载并初始化所有的Bean对象,取Bean对象平均速度更快,后者是需要使用才去加载,更加轻量。
Spring存取Bean对象的基本流程
Spring读取Bean流程
- 首先读取xml配置,扫描类文件,从配置或者注解中获取Bean的定义信息
- 将获取的这些信息注册到Spring容器中
Spring加载/Bean流程
- 先实例化Bean即分配内存空间
- 再设置Bean中的属性
- 再进行Bean的初始化
容器中同类型有多份Bean时,获取指定Bean
使用id:
没有出错,每次需要强转
使用类型:
编译通过,运行出错
id+名称:
因此,为了代码的简洁性和唯一定位Bean的需求我们更推荐第三种方式。