菜鸡的spring学习记录(2)[IOC与DI](配置文件实现方式)

    xiaoxiao2022-07-14  158

    IOC和DI的概念

    IOC

    1.IOC是控制反转的意思。首先理解要控制什么。我们在面向对象编程的时候一个类A要依赖另一个类B,我们是通过newB类来保证A类编译的时候不报错。这么做有个问题,当我们各种类互相的依赖关系特别多的时候,依赖关系变得很复杂,让我们维护很蛋疼(高耦合)。一旦有个类依赖的类不在本地,那么编译都无法通过。我们可以通过做一个工厂类来实现解耦。但是这种方法也无法实现编译的通过。在工厂里边我们可以通过反射的方式来得到一个类,这样才能实现真正的解耦,这就是IOC的概念。我们把对于B类的控制权不交给A类,而是交给工厂,这个工厂负责分发我们需要的对象,并且初始化对象实例。这个工厂在spring中就是IOC。 (总结起来就是不new对象了,改成从工厂里通过反射获得)

    DI

    1.DI就是依赖注入。依赖注入是控制反转的具体实现。IOC只是一种概念,我们不一定需要使用spring才能实现IOC,我们完全可以手写一个工厂来读取配置文件然后反射出一个类,让工厂分发这个类。spring和我们手写的工厂是IOC的具体实现方式。

    spring中的IOC实现(DI)

    一.读取配置文件方式 1.有参构造函数方式 需要类里边有构造函数,需要配置文件里边有 2.使用set方法方式 没有构造函数,然后要求全部的属性都有set方法,通过配置文件中来进行初始值的设置。 3.无参构造函数方式 不用写参数,因为不需要对类里边的属性赋值,所以不用传进来值,因此只需要写好id,class就可以了。 4.P命名空间方式(2.5以上支持) beans标签要加上这句 xmlns:p=“http://www.springframework.org/schema/p” 然后以前的property可以改成 p:<属性名>=“xxx” 引入常量值 p:<属性名>-ref=“xxx” 引用其它Bean对象 例子: <bean id=“student” class=“com.springtest.proinput.Student” p:name:小明> 重点:只是用来简化配置文件 5.spEL(3X以上版本) 作用:支持在运行时操作和查询对象,其语法类似统一的EL语言 语法: #{…} , 引用另一个Bean 、属性、 方法 SpEL表达式的使用功能比较多,Bean操作相关的通常有: #{beanid} 引用Bean(具体对象) #{beanId.属性} 引用Bean的属性 #{beanId.方法(参数)} 调用Bean的方法 例子: 本质:调用引用的bean里边的get方法来将属性值给当前的bean 二.自动装配 1.概念:自动装配是用来提高开发效率的一种手段。核心概念就是根据要反射的bean它的set方法或者构造函数决定用类型还是名字与其他的bean匹配,如果匹配上就注入,不匹配就为null。 2.实现方式:在bean标签中加入 autowire=“匹配模式” (1)autowire=“byType”:根据类型装配 (2)autowire=“byName”:根据名字进行装配 (3)autowire=“constructor”:根据构造函参数类型进行装配 3.过滤: (1):为什么要过滤:因为当我们根据类型进行匹配的时候,由于会有很多相同的类型,比如有多个bean他们的class引用都是相同的,那么就需要一种匹配的原则保证注入的正确,这种方式就叫过滤。 (2):过滤的使用方式:bean里加上autowire-candidate=”false”,这样这个bean就不会被用于匹配。 4.循环依赖问题: (1):循环依赖问题的本质:就是类的相互引用造成编译的时候不断的初始化依赖,并且没完没了。解决方式是用set方法来解决,初始化的时候不需要初始化依赖,依赖通过后期set方法设置进来,这样编译可以通过了。 5.单例与多例模式: spring容器创建Bean后,通过代码获取的bean,无论多少次,都是同一个Bean的实例(同一个实例的引用),因此对于每次都要获得新实例的情况,我们需要设置单例与多例。scope="prototype"是启动多例,默认是单例。 6.延迟加载: 延迟加载本质是用来减少内内存消耗的,说白了就是用到这个bean的时候再生成他。 延迟加载可以设置在两个地方:bean(lazy-init=“false/true”)中和beans( default-lazy-init=“true”)中。

    需要注意的

    1.当使用单利模式和多例模式的时候,一定是只能在一个applicationxmlcontext(IOC容器)下来使用,不同的IOC容器下哈希值是不同的。 2.复杂的bean注入(属性里有list map 数组 properties) 例子:

    <bean id="复杂的注入" class="配置文件形式.复杂的注入" scope="prototype"> <property name="arr"> <list> <value>小明</value> <value>小刚</value> <value>小红</value> </list> </property> <property name="list"> <list> <value>元素1</value> <value>元素2</value> </list> </property> <property name="map"> <map> <entry key="学生1" value="student"></entry> </map> </property> <property name="properties"> <props> <prop key="key">value</prop> <prop key="key2">value2</prop> </props> </property> </bean> </beans>
    最新回复(0)