Spring_IOC

1. IOC和DI

1.1 IOC

IOC(Inversion of Control):反转控制。
在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的资源,在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效率。
反转控制的思想完全颠覆了应用程序组件获取资源的传统方式:反转了资源的获取方向——改由容器主动的将资源推送给需要的组件开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可,极大的降低了学习成本,提高了开发的效率。这种行为也称为查找的被动形式。

1.2 DI

DI(Dependency Injection):依赖注入。
IOC的另一种表述方式:即组件以一些预先定义好的方式(例如:setter 方法)接受来自于容器的资源注入。相对于IOC而言,这种表述更直接。

1.3 IOC容器在Spring中的实现

  1. 在通过IOC容器读取bean的实例之前, 需要先将IOC容器本身实例化
  2. Spring提供了IOC容器的两种实现方式

(1)BeanFactory:IOC容器的基本实现,是Spring内部的基础设施,是面向Spring本身的,不是提供给开发人员使用的。
(2)ApplicationContext:BeanFactory的子接口,提供了更多高级特性。面向Spring的使用者,几乎所有场合都使用ApplicationContext而不是底层的BeanFactory。

2. 依赖注入(给bean的属性赋值)

2.1 注入的方式

2.1.1 set方法注入

    <!--  注册一个Person对象, Spring会自动创建这个Person对象  -->
    <bean id = "person01" class="com.lz.bean.Person">
        <property name="name" value="zhangsan"></property>
        <property name="age" value="19"></property>
        <property name="gender" value=""></property>
    </bean>

2.1.2 构造器注入

    <bean id = "car1" class="com.lz.bean.Car">
        <constructor-arg name="brand" value="BMW"></constructor-arg>
        <constructor-arg name="crop" value="huanccehn"></constructor-arg>
        <constructor-arg name="price" value="30000"></constructor-arg>
    </bean>

2.2 可以使用的注入的值

2.2.1 字面量

2.2.2 null值

2.2.3 外部bean

2.2.4 内部bean

2.3 集合属性

2.3.1 数组和List

<bean id="person02" class="com.lz.bean.Person">
    <property name="name" value="zhangsan"></property>
    <property name="age" value="19"></property>
    <property name="gender" value=""></property>
    <property name="cars">
        <list>
            <!--使用外部bean-->
            <ref bean = "car1"/>
            <!--使用内部bean-->
            <bean class="com.lz.bean.Car">
                <constructor-arg name="brand" value="BMW"></constructor-arg>
                <constructor-arg name="crop" value="huanccehn"></constructor-arg>
                <constructor-arg name="price" value="30000"></constructor-arg>
            </bean>
        </list>
    </property>
</bean>

2.3.2 Map

<bean id = "person03" class="com.lz.bean.Person">
    <property name="name" value="zhangsan"></property>
    <property name="age" value="19"></property>
    <property name="gender" value=""></property>
    <property name="carMap">
        <map>
            <entry key="AA" value-ref="car1"/>
            <entry key="BA" value-ref="car1"/>
        </map>
    </property>
</bean>

2.3.3 Properties

3. bean之间的关系

3.1 继承

在这里插入图片描述

3.2 依赖

在这里插入图片描述

4. bean的作用域

  1. singleton: 单例(默认值),在IOC容器中,只有一个该bean的实例对象.并且该bean的对象会在IOC容器初始化的时候创建.
  2. prototype: 原型,在IOC容器中,有多个该bean的实例对象.不会在IOC容器初始化的时候创建,而是在每次getBean的时候才会创建一个新的对象返回.
  3. request:一次请求期间
  4. session:一次会话期间.

5. bean的生命周期

  1. 调用构造器创建对象
  2. 给对象的属性设置值
  3. 调用init方法进行初始化
  4. 使用对象
  5. 调用destroy方法进行对象的销毁.

在这里插入图片描述

6. bean的配置方式

6.1 全类名(反射)的方式

在这里插入图片描述

6.2 工厂方法

6.2.1 静态工厂方法

在这里插入图片描述

6.2.2 实例工厂方法

在这里插入图片描述

6.3 实现FactoryBean接口

  1. 自定义工厂实现 FactoryBean接口, 并实现 getObject 方法
  2. 不管是单例还是多例, 使用这种方式, 容器启动时不会创建对象, 只有在获取对象时才创建.

在这里插入图片描述

7. 引入外部化的配置文件(管理连接池)

在这里插入图片描述

带泛型的依赖注入(原理)
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值