编写Spring的第一个程序
1.新建一个空的工程
2.输入对应的工程名称和位置
3.在新建的工程下面新建一个模块
4.选择项目类型为Maven项目,选择项目模板为quickstart,点击finish
5.输入模块的名称,模块的位置,以及Maven项目的坐标
6.点击finish即可
7.最后点击OK
8.项目构建成功后,进行简单的整理工作
新建resources资源文件夹
删除掉默认生成的App类以及AppTest类
清理不需要的pom配置
将jdk编译和运行的版本修改为1.8
9.添加Maven相关依赖,这里主要是两个依赖,如下所示:
Junit单元测试依赖
Spring的依赖
10.创建相关类(接口和接口对应的实现类)
接口代码如下所示:
接口的实现类代码如下所示:
测试类相关代码如下所示:
运行结果如下所示:
总结:上述创建业务层对象采用的是正转的方式,即程序通过new的方式主动创建对象,由开发人员主动创建对象,控制权在开发人员手上.
那么接下来我们通过Spring框架来创建业务层对象:
11.首先创建Spring配置文件beans.xml
注意:如果没有上述SpringConfig这个选项,可以在Maven设置中刷新一下,重新加载依赖就可以了.
beans.xml配置文件内容如下所示:
beans.xml配置文件解释
1.Spring-beans.xsd是Spring配置文件的约束文件,用于约束Spring配置,和MyBatis的DTD是一样的.
2.Spring的核心配置文件的根标签一定是beans
3.Spring把java对象称为bean,beans标签中用于配置多个bean.
12.在Spring配置文件中声明对象
bean标签解释
作用:声明bean,用于告诉Spring容器要创建哪个类的对象.
常见属性:
id:对象的自定义名称,和变量命名规范是一样的,Spring通过这个名称在容器中查找对象.
class:需要创建对象所对应的类的全限定名称(这里绝对不可以是接口,因为Spring底层创建对象是依赖的反射,所以必须要使用类).
注意:
一个bean标签声明一个对象,也就是说如果声明了多个bean标签,那么相当于向Spring容器中注册了多个对象.
底层原理:
1.Spring通过解析beans.xml配置文件
2.读取bean标签的class属性值,获取到类的全限定名称,通过反射创建对象
3.最后将对象保存到Spring容器中,这里的Spring容器本质就是一个map,键是id的值,值是反射创建的对象.
相关代码如下所示:
13.在测试类中获取对象并且使用,相关代码如下所示:
代码相关解释:
1.这里的配置文件的路径是相对于类路径下面的,也就是target目录下面的classes目录下面,所以我们只需要把配置文件放在resources目录下即可.
2ApplicationContext表示的就是Spring容器了,但是该类是一个接口,相关继承体系结构图如下:
ClassPathXmlApplicationContext:该类是通过XML配置文件的方式往Spring容器中注册bean对象,需要传入XML文件路径,XML文件的路径是相对于类路径下.
FileSystemXmlApplicationContext:该类是通过XML配置文件的方式往Spring容器中注册bean对象,需要传入XML文件路径,XML文件的路径是绝对路径,即磁盘位置,代码如下所示:
AnnotationConfigApplicationContext:该类是通过注解配置的方式往Spring容器中注册bean对象,需要传入bean对象所对应的Class对象.
3.从容器中获取bean对象的几种方式
方式一:通过id属性的值获取
注意:这种方式获取bean对象返回的是Object类型,需要自己手动向下转型
方式二:通过Class类型获取
注意:使用这种方式获取对象有一个弊端,如果容器中注册了多个同类型的bean,如下所示:
那么这种方式获取会抛出如下异常:
异常名称:NoUniqueBeanDefinitionException(不是唯一Bean声明异常)
产生原因:容器中存在了多个同类型的多个对象.
解决办法:同类型的对象只能有一个,或者换一种方式获取bean.
方式三:同时通过id和Class类型获取
这种方式既可以避免强制类型转换,也可以防止容器中存在多个类型bean的情况,推荐使用这种方式.
4.ApplicationContext容器中对象的装配时机
ApplicationContext容器,会在容器对象初始化时,将其中的所有对象一次性全部装配好。
可以验证一下:
由于对象是通过反射调用无参构造方法创建的,所以这里我们在对象的类里面添加一个无参构造方法,如下所示:
接着在测试类中创建Spring容器,代码如下所示:
配置文件如下所示:
执行结果如下所示:
1.以后代码中若要使用到这些对象,只需从内存中直接获取即可。这样执行效率较高,但是占用内存。
2.如果需要创建的对象没有提供无参构造方法,那么系统会自动生成无参构造方法,但是如果我们手动编写了带参构造方法,会覆盖无参构造方法,那么就会抛出如下异常.
异常名称:BeanCreationException(Bean对象创建异常)
产生原因:Spring底层创建对象使用的是无参构造方法,带参构造方法覆盖了无参构造方法,抛出NoSuchMethodException,从而抛出BeanCreationException异常.
解决办法:手动补上无参构造方法即可.
5.Spring装配原理图如下所示:
注意:在创建Spring的容器时,会创建配置文件中声明的所有对象