Spring学习(上)

1 概述

1.1 简介

  1. 整合现有的技术框架;

  2. SSM:SpringMvc + Spring + MyBatis;

  3. IOC与AOP;

1.2 IOC

  1. 概述:控制反转,程序耦合性降低,可以专注于实现;使用set注入,程序成为被动的接收对象;使用者成为主动方,“自定义程度”增加;

  2. 本质:一种思想;通过依赖注入实现,形象的看,做一个IoC容器,放入东西,使用者取用;

2 第一个程序

key: 代码被spring创建和管理;spring的对象称为Bean;在配置文件中注册成功后,对应方法会被spring托管;

2.1 实现

  1. 导入依赖(包);

  2. 在.xml文件中创建对象:

    image-20210714095501503

    用.xml文件加载参数,必须写的:这里引了上图的hello对象;另,强转类型除了前面加“(Hello)”,还可以写成context.getBean("hello",Hello.class)

    image-20210714095742101

    通过ApplicationContext获取spring容器:

    image-20210714152451431

  3. Bean = 对象: 控制反转的本质即写好配置文件后交给“容器”(即Beans or .xml),使用时直接调用(从“容器”里取),不再需要new一个对象出来,spring框架帮我们根据配置文件创建对象(控制对象改变):

    image-20210714101559972

    程序接收对象而不创建(反转);依赖注入,即用set方法注入(必须有set方法):

    image-20210714144803257

  4. ref与value的区别:前者为引用spring容器中创建好的对象,后者是具体值(基本数据类型);

2.2 IoC创建对象方式

  1. 使用无参构造:

    image-20210714164903774

    默认方法,即创建一个类的时候,会有默认的无参构造方法,IoC使用这个方法来创建对象;

  2. 使用有参构造:

    image-20210714165023822

    若要使无参构造方法失效,需要定义一个有参构造方法,如上图;具体:

    image-20210714165733944

    image-20210714165806056

    image-20210714165824632

    主要是第三种通过参数名;

  3. 注意点:

    • 每写一个类就注册进配置文件中,进而在程序运行时,spring会把所有注册进来的类都创建对象(或者叫实例化,运行时等待被调用);

    • 对于同一个类,创建几个不同名的实例,指向的都是同一个类;

  4. 总结:配置文件加载时,容器(即配置文件中的Bean)中的对象就已经被初始化了;

3 配置与环境

3.1 Spring配置说明

  1. 别名:放在Beans里

    image-20210715093410919

  2. Bean的配置:(实际上还有很多很多)

                        image-20210715093926488

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

                             image-20210715094529374

 

3.2 DI 依赖注入

key: 三种方式

  1. 构造器注入:如前所示;

  2. Set方式注入:重点

    • 依赖:bean对象的创建依赖于spring容器;

    • 注入:bean对象中的所有属性都由容器来注入;

    • 具体:

      类中的属性如下:

      image-20210715114649287

      在配置文件中,对应属性的set注入方式:

      image-20210715114002732

      image-20210715114216994

      image-20210715114556637

  3. 拓展方式注入

    key: 注意导入相关的约束.

    • p空间:上面是头文件约束

               image-20210715160928530

    • c空间:通过构造器

      image-20210715162716513

3.3 Bean作用域

  1. 单例模式:Spring默认机制,所有人共享同一个对象

    image-20210715164238012

    image-20210715165023048

  2. 原型模式:每次从容器中get的时候,都会产生一个新对象:

    image-20210715165548610

    image-20210715164957549

  3. 其余的request、session和application在web开发中使用;

3.4 Bean的自动装配

key: 自动装配是spring满足Bean依赖的一种方式,会在上下文中自动寻找,并装配属性.

  1. 三种装配方式:

    • 在.xml中显式装配;

    • 在java中显式装配;

    • 隐式的自动装配

  2. 测试:

    • 环境搭建:

  3. 自动装配:(会自动在容器上下文中查找)

    • 自动装配前:

      image-20210716090418860

           image-20210716090050386

    • byName自动装配:对比上上图看;bean id中的内容和类中set方法中的内容必须一模一样,否则找不到

      image-20210716090857784

    • byType:同上,查找的 是和自己对象属性类型相同的bean(id,即类名,甚至可以省略),但是同类型只能有一个bean(全局唯一,class是关键),否则报错

      image-20210716091526851

  4. 小结:

    image-20210716092548706

    第二点中,后半句,cat和dog属于people类,即bean和自动注入的属性类型一致;

3.5 使用@Autowired实现自动装配

  1. 导入约束(上)和配置注解支持(下):

    image-20210716095156551

    注意约束名字,可以直接复制替换:

    image-20210716113301084

  2. 使用:@Autowired可在属性上使用,也可以放到set方法上,但是加了注解后,可以不用set方法(前提是加了自动装配注解的属性在spring容器|IoC容器|配置文件中存在,即已经配置好了,且符合byName条件,即通过类型或者属性名唯一确定):

    image-20210716113712830

    image-20210716114053193

  3. 注解属性说明:

    image-20210716114745109

    另@Nullable也表示可为空;

  4. 复杂情况:同一类对应多个类型值(属性值不唯一时),加@Qualifier注解可指定该类对应那个注册的类型值,而未指定则报错了(如cat)

    image-20210716115210390

    image-20210716115124378

  5. 小结

    //这两个是一对使用
    @Autowired
    @Qualifier(value = "dog222")

    image-20210716115505665

3.6 使用@Resource实现自动装配

  1. 功能:较@Autowired高级,会自动先根据id中的名,再根据类型名来找到配置内容,可以直接赋值;

  2. 可能的错误:

    找名字,配置文件中同一类型(Cat类)下两个不同的id(cat1和cat2),会失败;或者名字(@Resource(name = “cat”),这样没有类名能对上)对不上会报错

    image-20210716143730541

    下图指定为cat2,在上图的情况下就不会装配错误

    image-20210716144007290

  3. 小结:@Resource和@Autowired的区别

    • 都用来自动装配,都可放在属性字段上;

    • @Autowired默认通过byType方式实现,且对象必须存在;

    • @Resource默认通过byName方式实现,找不到则自行换为byType实现,否则报错;

    • 执行顺序不同,一个byType,一个byName;

posted @ 2021-07-16 16:06  youngsam  阅读(31)  评论(0)    收藏  举报