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

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值