Spring学习(上)
1 概述
-
整合现有的技术框架;
-
SSM:SpringMvc + Spring + MyBatis;
-
IOC与AOP;
1.2 IOC
-
概述:控制反转,程序耦合性降低,可以专注于实现;使用set注入,程序成为被动的接收对象;使用者成为主动方,“自定义程度”增加;
-
本质:一种思想;通过依赖注入实现,形象的看,做一个IoC容器,放入东西,使用者取用;
2 第一个程序
key: 代码被spring创建和管理;spring的对象称为Bean;在配置文件中注册成功后,对应方法会被spring托管;
2.1 实现
-
导入依赖(包);
-
在.xml文件中创建对象:
![image-20210714095501503]()
用.xml文件加载参数,必须写的:这里引了上图的hello对象;另,强转类型除了前面加“(Hello)”,还可以写成context.getBean("hello",Hello.class)
![image-20210714095742101]()
通过ApplicationContext获取spring容器:
![image-20210714152451431]()
-
Bean = 对象: 控制反转的本质即写好配置文件后交给“容器”(即Beans or .xml),使用时直接调用(从“容器”里取),不再需要new一个对象出来,spring框架帮我们根据配置文件创建对象(控制对象改变):
![image-20210714101559972]()
程序接收对象而不创建(反转);依赖注入,即用set方法注入(必须有set方法):
![image-20210714144803257]()
-
ref与value的区别:前者为引用spring容器中创建好的对象,后者是具体值(基本数据类型);
2.2 IoC创建对象方式
-
使用无参构造:
![image-20210714164903774]()
默认方法,即创建一个类的时候,会有默认的无参构造方法,IoC使用这个方法来创建对象;
-
使用有参构造:
![image-20210714165023822]()
若要使无参构造方法失效,需要定义一个有参构造方法,如上图;具体:
![image-20210714165733944]()
![image-20210714165806056]()
![image-20210714165824632]()
主要是第三种通过参数名;
-
注意点:
-
每写一个类就注册进配置文件中,进而在程序运行时,spring会把所有注册进来的类都创建对象(或者叫实例化,运行时等待被调用);
-
对于同一个类,创建几个不同名的实例,指向的都是同一个类;
-
-
总结:配置文件加载时,容器(即配置文件中的Bean)中的对象就已经被初始化了;
3 配置与环境
3.1 Spring配置说明
-
别名:放在Beans里
![image-20210715093410919]()
-
Bean的配置:(实际上还有很多很多)

3. import:一般用于团队,可将多个配置文件合为一个总的,即不同的类对应不同的.xml文件,导入时导总的即可

3.2 DI 依赖注入
key: 三种方式
-
构造器注入:如前所示;
-
Set方式注入:重点
-
依赖:bean对象的创建依赖于spring容器;
-
注入:bean对象中的所有属性都由容器来注入;
-
具体:
类中的属性如下:
![image-20210715114649287]()
在配置文件中,对应属性的set注入方式:
![image-20210715114002732]()
![image-20210715114216994]()
![image-20210715114556637]()
-
-
拓展方式注入
key: 注意导入相关的约束.
-
p空间:上面是头文件约束
-

-
-
c空间:通过构造器
![image-20210715162716513]()
-
3.3 Bean作用域
-
单例模式:Spring默认机制,所有人共享同一个对象
![image-20210715164238012]()
![image-20210715165023048]()
-
原型模式:每次从容器中get的时候,都会产生一个新对象:
![image-20210715165548610]()
![image-20210715164957549]()
-
其余的request、session和application在web开发中使用;
3.4 Bean的自动装配
key: 自动装配是spring满足Bean依赖的一种方式,会在上下文中自动寻找,并装配属性.
-
三种装配方式:
-
在.xml中显式装配;
-
在java中显式装配;
-
隐式的自动装配;
-
-
测试:
-
环境搭建:
-
-
自动装配:(会自动在容器上下文中查找)
-
自动装配前:
![image-20210716090418860]()
![image-20210716090050386]()
-
byName自动装配:对比上上图看;bean id中的内容和类中set方法中的内容必须一模一样,否则找不到
![image-20210716090857784]()
-
byType:同上,查找的 是和自己对象属性类型相同的bean(id,即类名,甚至可以省略),但是同类型只能有一个bean(全局唯一,class是关键),否则报错
![image-20210716091526851]()
-
-
小结:
![image-20210716092548706]()
第二点中,后半句,cat和dog属于people类,即bean和自动注入的属性类型一致;
3.5 使用@Autowired实现自动装配
-
导入约束(上)和配置注解支持(下):
![image-20210716095156551]()
注意约束名字,可以直接复制替换:
![image-20210716113301084]()
-
使用:@Autowired可在属性上使用,也可以放到set方法上,但是加了注解后,可以不用set方法(前提是加了自动装配注解的属性在spring容器|IoC容器|配置文件中存在,即已经配置好了,且符合byName条件,即通过类型或者属性名唯一确定):
![image-20210716113712830]()
![image-20210716114053193]()
-
注解属性说明:
![image-20210716114745109]()
另@Nullable也表示可为空;
-
复杂情况:同一类对应多个类型值(属性值不唯一时),加@Qualifier注解可指定该类对应那个注册的类型值,而未指定则报错了(如cat)
![image-20210716115210390]()
![image-20210716115124378]()
-
小结:
//这两个是一对使用 @Autowired @Qualifier(value = "dog222")![image-20210716115505665]()
3.6 使用@Resource实现自动装配
-
功能:较@Autowired高级,会自动先根据id中的名,再根据类型名来找到配置内容,可以直接赋值;
-
可能的错误:
找名字,配置文件中同一类型(Cat类)下两个不同的id(cat1和cat2),会失败;或者名字(@Resource(name = “cat”),这样没有类名能对上)对不上会报错
![image-20210716143730541]()
下图指定为cat2,在上图的情况下就不会装配错误
![image-20210716144007290]()
-
小结:@Resource和@Autowired的区别
-
都用来自动装配,都可放在属性字段上;
-
@Autowired默认通过byType方式实现,且对象必须存在;
-
@Resource默认通过byName方式实现,找不到则自行换为byType实现,否则报错;
-
执行顺序不同,一个byType,一个byName;
-



































浙公网安备 33010602011771号