用户登录
用户注册

分享至

spring之Ioc与DI

  • 作者: 日醒已散
  • 来源: 51数据库
  • 2021-10-25

spring 的体系结构


spring的ioc是一个map结构,当有多个类型匹配时 ,在自动按照类型注入的基础上按照变量名称前往springIoc容器查找


@Autowired
自动按照类型注入。当使用注解注入属性时,set方法可以省略。它只能注入其他 bean 类型。当有多个类型匹配时,使用要注入的对象变量名称作为 bean 的 id,在 spring 容器查找,找到了也可以注入成功。找不到就报错。

@Qualifier
在自动按照类型注入的基础之上,再按照 Bean 的 id 注入。它在给字段注入时不能独立使用,必须和@Autowire 一起使用;但是给方法参数注入时,可以独立使用
属性:value:指定 bean 的 id。

1.控制反转-Inversion Of Control

工厂就是负责给我们从容器中获取指定对象的类。这时候我们获取对象的方式发生了改变。
原来:我们在获取对象时,都是采用 new 的方式。是主动的。

现在:
我们获取对象时,同时跟工厂要,有工厂为我们查找或者创建对象。是被动的。

将创建对象的权利交给框架:

<!--spring对bean的管理细节
    1.创建bean的三种方式
    2.bean对象的作用范围
    3.bean对象的生命周期
-->
<!--创建bean的三种方式-->
<!--第一种方式
    第一种方式 使用默认构造函数创建,
    在spring的配置文件中使用bean标签,配以class和id属性,且没有其他属性和标签时,
    采用的是默认构造函数创建的bean对象,此时,类中没有默认构造函数,则bean对象无法创建

    <bean id="accountService" class="com.maxwell.service.impl.AccountServiceImpl"></bean>
-->
<!--第二种方式,使用普通工厂的方法创建对象,(使用某个类中方法创建对象,然后存入spring容器)-->
<!--<bean id="instanceFactory" class="com.maxwell.factory.InstanceFactory"></bean>-->
<!--<bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService"></bean>-->
<!--第三种方式,使用工厂中的静态方法创建对象(使用某个类中静态方法创建对象,然后存入spring容器)-->

<!--<bean id="accountService" class="com.maxwell.factory.StaticFactory" factory-method="getAccountService"></bean>-->

<!--2.bean对象的作用范围
    bean标签的scope属性:
         作用:指定bean的作用范围
            取值:
                singleton  单例的 (默认值)
                prototype  多例的
                request    作用于web应用的请求范围
                session    作用于web应用的会话范围
                global-session  作用于集群环境的会话范围(全局会话范围),当不是集群环境时,它就是session.
-->
<!--3.bean对象的生命周期
    单例对象:
    出生:当创建容器时对象出生
    活着:只要容器还在,对象就一直活着
    死亡:容器销毁,对象消亡
 总结:单例对象的生命周期和容器相同
多例对象:
    出生:当使用对象时spring框架才为我们创建对象
    活着:对象只要是我们在使用过程中就一直活着
    死亡:当对象长时间不用,或者没有对象引用时,由JAVA垃圾回收线程回收

-->

2.依赖注入( Dependency Injection)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.51sjk.com/Upload/Articles/1/0/295/295030_20210728132732417.jpg"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.51sjk.com/Upload/Articles/1/0/295/295030_20210728132732886.jpg
    http://www.51sjk.com/Upload/Articles/1/0/295/295030_20210728132732886.jpg/spring-beans.xsd">
    
<!--spring的依赖注入:
    依赖注入:
    Dependency Injection
    IOC的作用:
        降低程序间的耦合
    依赖关系间的管理:以后都交给Spring来管理
    在当前类要用到其他类的对象,由Spring为我们提供,我们只要在配置文件中说明即可
    依赖关系的维护:
        就称之为依赖注入
    依赖注入:
          能注入的数据有三类
            1.基本类型和string
            2.其他bean类型(在配置文件中或注解配置过的bean)
            3.复杂类型/集合类型
    注入的方式有三种:
            1.通过构造函数提供
            2.通过set方法提供
            3.使用注解提供

-->
<!--1.通过构造函数提供
    使用constructor-arg标签
    出现的位置:在bean标签的内部
        标签中的属性:
        type:用于指定要注入的数据类型,该数据类型也就是构造函数中某个参数的数据类型
        name:用于指定构造函数中指定名称的参数赋值
        index: 用于指定要注入的数据给构造函数中指定位置的参数赋值。索引位置从0开始
        =======================以上三个用于给构造函数中哪个参数赋值==========================
        value:用于提供基本数据类型和String类型的数据
        ref:用于指定其它的bean类型的数据,它指的是就是在Spring核心容器中出现过的对象

        优势:
            在获取bean对象时,注入数据是必须的,否则无法创建对象
        弊端:
            改变了bean对象的实例化方式,使我们在创建对象时,如果用不到这些数据时,也必须提供
-->
<bean id="accountService" class="com.maxwell.service.impl.AccountServiceImpl">
    <!--<constructor-arg type="java.lang.String" value="test"></constructor-arg>-->
    <constructor-arg name="name" value="JACK"></constructor-arg>
    <constructor-arg name="age" value="18"></constructor-arg>
    <constructor-arg name="birthday" ref="new"></constructor-arg>
</bean>

<!--配置一个日期对象-->
<bean id="new" class="java.util.Date"></bean>

<!--2.通过set方法注入         -------》》更常用的方式注入
    涉及的标签:property
    出现的位置:bean标签的内部
    标签中的属性:
        name: 用于指定注入set方法名称
        value: 用于提供基本数据类型和String类型的数据
        ref:用于指定其它的bean类型的数据,它指的是就是在Spring核心容器中出现过的对象
        优势: 
        		创建对象时没有明确的限制,可以直接使用默认构造函数
        弊端:
        		如果某个成员必须有值,则获取对象是有可能set方法没有执行
-->
<bean id="accountService2" class="com.maxwell.service.impl.AccountServiceImpl2">
    <property name="name" value="Marry"></property>
    <property name="age" value="20"></property>
    <property name="birthday" ref="new"></property>
</bean>


<!--复杂类型的注入/集合类型数据的注入
    用于给List结构注入的标签:
        list  set  array
    用于给map结构注入的标签有:
        map  props
        结构相同,标签可以互换
 -->
<bean id="accountService3" class="com.maxwell.service.impl.AccountServiceImpl3">
    <property name="myStrs">
        <array>
            <value>111</value>
            <value>222</value>
        </array>
    </property>
    <property name="myList">
        <list>
            <value>aaa</value>
            <value>bbb</value>
            <value>ccc</value>
        </list>
    </property>
    <property name="mySet">
        <set>
            <value>aaa</value>
            <value>bbb</value>
            <value>ccc</value>
        </set>
    </property>
    <property name="myMap">
        <map>
            <entry key="test1" value="aaa"></entry>
            <entry key="test2" value="bbb"></entry>
            <entry key="test3" value="ccc"></entry>
        </map>
    </property>
    <property name="props">
        <map>
            <entry key="testA" value="123"></entry>
            <entry key="testB" value="456"></entry>
        </map>
    </property>
</bean>
软件
前端设计
程序设计
Java相关