Spring学习笔记(一)

发现Spring很多知识点都不了解,需要学习和巩固。
什么是控制反转?
控制:一般程序会主动创建对象,并控制对象。
反转:正转是我们需要对创建的对象主动去设置依赖的资源和对象。反转,我们不用主动去设置。

IOC容器帮我们去控制我们所需要的对象,并且对象所以来的资源,IOC去创建并帮我们设置好,所有,当我们从IOC容器拿到对象后,这个对象可以直接使用,提高了程序的功能复用,并进行了解耦。

什么是依赖注入?
依赖了什么:应用程序需要依赖IOC容器来获得资源对象。
注入:IOC容器将对象注入进应用程序中。
IOC中依赖有两层含义:Bean依赖容器 和 容器注入Bean的依赖资源。

凡是继承了BeanFactory的类都是IOC容器。BeanFactory接口提供了IOC最基本的功能。我们看见的ApplicationContext接口就是扩展了BeanFactory接口。

继承了BeanFacory的类:
(1)XmlBeanFactory:可以从类路径或者文件系统中获取配置文件。
1.将文件资源作为构造器参数传入(FileSystemResource)
2.将类路径资源作为构造器传入(Resource)
(2)ClassPathXmlApplicationContext:从类路径获取配置文件。
(3)FileSystemXmlApplicationContext:从文件系统获取配置文件。

IOC创建Bean并获取的简略过程:
(1)通过BeanDefinationReader读取XML配置文件,根据定义生成BeanDefination对象,IOC根据BeanDefination进行实例化Bean,组装Bean等操作。
(2)客户端通过实例化容器来得到想要的Bean对象。

根据Bean定义创建Bean的几种方式如下:
(1)构造器实例化bean。
(2)工厂实例化bean。
IOC容器注入bean的依赖资源有3种方式:
(1)构造器注入。

<constructor-arg index="0" value="常量"/>
<constructor-arg index="0" ref="引用"/>

构造器注入
(2)通过setter方式注入依赖。

<property name="message" value="常量"/>
<property name="message" ref="引用"/>
<bean id="setBean" class="spring.chapter3.ListTestBean">
        <property name="values">
            <set>  <!-- list标签 针对List对象    如果是Collection list set标签都能用 -->
                <value>1</value>
                <value>2</value>
            </set>
        </property>
    </bean>
    <!-- Map类型的属性注入 -->
    <bean id="mapBean" class="spring.chapter3.MapTestBean">
        <property name="values">
            <map key-type="java.lang.String" value-type="java.lang.String">
                <entry key="键常量" value="值常量"/>
          	    <entry key-ref="键引用" value-ref="值引用"/>
            </map>
        </property>
    </bean>

(3)方法注入,通过配置改变Bean方法。

当然, 我们可以使用p命名空间简化setter注入。

<bean id="……" class="……" p:id="value"/> 
p:id等价于setter注入中的:
<property name="id" value="value"/>

<bean id="……" class="……" p:id-ref="bean1"/> 
p:id-ref等价于setter注入中的:
<property name="id" ref="bean1"/>

关于bean的循环依赖问题
首先,我先解释一下什么是循环依赖吧。循环依赖,最形象的例子就是A对象中持有B的引用,B对象中持有C的引用,C对象中持有A的引用。那么在IOC容器注入时,会出现循环依赖,不断去注入。

1.对于构造器注入的造成的循环依赖问题,这种是无法解决的,只能抛出异常。
创建A的时候,构造器需要B对象,然后去创建B,B构造器需要C对象,然后去创建C,C构造器需要A,然后又去创建A,这样无限循环下去了。
Spring对于每一个正在创建的bean,都会将其标识放入“正在创建bean的池子里”,当创建bean的时候,会查看这个池子,是否要创建的对象标识在池子中,如果存在,将抛出BeanCurrentlyInCreationException,表示循环依赖。对于创建完成bean将其标识从池子中移除。

2.对于setter注入的循环依赖是spring是通过提前暴露刚完成构造器注入但没执行setter注入的bean来完成的。只能解决单例作用域bean的问题。
对于bean是prototype多例情况,每次需要都产生,Spring无法完成依赖注入。因为当A根据无参构造器创建后暴露这个bean,并将标识放到“正在创建bean的池子里”,当C需要的对象为A的时候,只能重新创建新的对象,而不是拿原来暴露出来的A,因此会无限循环下去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值