Spring个人学习笔记01

资料来源B站黑马程序员https://www.bilibili.com/video/BV1Fi4y1S7ix?p=8&spm_id_from=pageDriver在这Spring核心架构图里插入图片描述

核心概念:
IOC 控制反转
使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转
Spring技术对Ioc思想进行了实现
Spring提供了一个容器,称为IOC容器,用来充当IoC思想的外部
IOC容器负责对象的创建、初始化等一系列工作,被创建或管理的对象在IOC容器中称为Bean。
在这里插入图片描述
DI(Dependency Injection)依赖注入
在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入
两个核心思想的最终的目的:充分解耦
1.使用IOC容器管理Bean(IOC)
2 在IOC容器内将有依赖关系的bean进行绑定(DI)
最终的效果:
使用对象的时候,不仅直接可以直接从IOC容器中获取,并且获取到的bean已经绑定了所有的依赖关系

IOC入门案例思路分析

1.管理的是什么?(Service与Dao)
2 .如何将被管理的对象告知给IOC容器?(配置)
3.被管理的对象交给IOC容器,如何获取到IOC容器?(接口)
4.IOC容器得到后,如何从容器中获取Bean?(接口方法)

(1**)要想实现依赖注入,必须要基于IOC管理Bean**
DI的入门案例要依赖于IOC
(2)Service中使用new形式创建的Dao对象是否保留?
需要删除掉,最终要使用IOC容器中的bean对象
(3)Service中需要的Dao对象如何进入到Service中? 在Service中提供方法,让Spring的IOC容器可以通过该方法传入bean对象
(4)Service与Dao间的关系如何描述?
使用配置文件

bean基础配置(id与class)

<bean id="" class=""/>

在这里插入图片描述
在这里插入图片描述

创建的Bean是否为单实例还是多实例?
在这里插入图片描述
为什么bean默认为单例?
bean为单例的意思是在Spring的IOC容器中只会有该类的一个对象
bean对象只有一个就避免了对象的频繁创建与销毁,达到了bean对象的复用,性能高
bean在容器中是单例的,会不会产生线程安全问题?
如果对象是有状态对象,即该对象有成员变量可以用来存储数据的,因为所有请求线程共用一个bean对象,所以会存在线程安全问题。如果对象是无状态对象,即该对象没有成员变量没有进行数据存储的,因方法中的局部变量在方法调用完成后会被销毁,所以不会存在线程安全问题
哪些bean对象适合交给容器进行管理?
表现层对象
业务层对象
数据层对象
工具对象

哪些bean对象不适合交给容器进行管理?
封装实例的域对象,因为会引发线程安全问题,所以不适合。

bean的实例化的四种方式:
1 使用构造方法进行实例化 无参构造器
2 使用静态工厂类对bean进行实例化操作
3 使用实例工厂实例化bean
4 使用FactoryBean实例化bean
bean的生命周期
bean生命周期是什么?
bean对象从创建到销毁的整体过程。bean生命周期控制是什么? 在bean创建后到销毁前做一些事情
(1)关于Spring中对bean生命周期控制提供了两种方式:
在配置文件中的bean标签中添加init-method和destroy-method属性
类实现InitializingBean与DisposableBean接口,这种方式了解下即可。
(2)对于bean的生命周期控制在bean的整个生命周期中所处的位置如下:
初始化容器
1.创建对象(内存分配)
2.执行构造方法
3.执行属性注入(set操作)
4.执行bean初始化方法
使用bean
1.执行业务操作
关闭/销毁容器
1.执行bean销毁方法
(3)关闭容器的两种方式:
ConfigurableApplicationContext是ApplicationContext的子类
close()方法
registerShutdownHook()方法

DI依赖注入

向一个类中传递数据的方式有几种?
普通方法(set方法)
构造方法

依赖注入描述了在容器中建立bean与bean之间的依赖关系的过程,如果bean运行需要的是数字或字符串呢?
引用类型
简单类型(基本数据类型与String)
Spring就是基于上面这些知识点,为我们提供了两种注入方式,分别是:
setter注入
简单类型/引用类型
构造器注入
简单类型/引用类型
方式一:删除name属性,添加type属性,按照类型注入
这种方式可以解决构造函数形参名发生变化带来的耦合问题
但是如果构造方法参数中有类型相同的参数,这种方式就不太好实现了
方式二:删除type属性,添加index属性,按照索引下标注入,下标从0开始 这种方式可以解决参数类型重复问题
但是如果构造方法参数顺序发生变化后,这种方式又带来了耦合问题
介绍完两种参数的注入方式,具体我们该如何选择呢?

  1. 强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现强制依赖指对象在创建的过程中必须要注入指定的参数 2. 可选依赖使用setter注入进行,灵活性强可选依赖指对象在创建过程中注入的参数可有可无3. Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨4. 如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入5. 实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入 6. 自己开发的模块推荐使用setter注入

自动装配:
IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配
自动装配方式有哪些?
按类型(常用)
按名称
按构造方法
不启用自动装配
注意事项:
**需要注入属性的类中对应属性的setter方法不能省略。**被注入的对象必须要被Spring的IOC容器管理。按照类型在Spring的IOC容器中如果找到多个对象,会NoUniqueBeanDefinitionException
一个类型在IOC中有多个对象,还想要注入成功,这个时候就需要
按照名称注入

最后对于依赖注入,需要注意一些其他的配置特征: 1. 自动装配用于引用类型依赖注入,不能对简单类型进行操作 2. 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用 3. 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推
荐使用 4. 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效

集合注入
集合中既可以装简单数据类型也可以装引用数据类型
数组
List
Set
Map
Properties


<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
    <!--数组注入-->
    <property name="array">
        <array>
            <value>100</value>
            <value>200</value>
            <value>300</value>
        </array>
    </property>
    <!--list集合注入-->
    <property name="list">
        <list>
            <value>itcast</value>
            <value>itheima</value>
            <value>boxuegu</value>
            <value>chuanzhihui</value>
        </list>
    </property>
    <!--set集合注入-->
    <property name="set">
        <set>
            <value>itcast</value>
            <value>itheima</value>
            <value>boxuegu</value>
            <value>boxuegu</value>
            <value>boxuegu</value>
        </set>
    </property>
    <!--map集合注入-->
    <property name="map">
        <map>
            <entry key="country" value="china"/>
            <entry key="province" value="henan"/>
            <entry key="city" value="kaifeng"/>
        </map>
    </property>
    <!--Properties注入-->
    <property name="properties">
        <props>
            <prop key="country">china</prop>
            <prop key="province">henan</prop>
            <prop key="city">kaifeng</prop>
            <prop key="test">测试属性集合类型</prop>
        </props>
    </property>
</bean>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值