java扫盲系列(3)-Spring 依赖注入

什么是依赖注入

从博主的理解就是,一般情况下我们创建对象会直接用new加上类名创建,这样写文件与文件之间有较强的耦合,项目class越来越多,文件之间相互依赖使得系统无法升级和更改。

那么我们要获取一个对象,又要保持系统的耦合度低怎么做呢,就是把对象传入需要用到的地方,而这个传入的对象,是依赖于配置进行自动化生成的,对使用者透明,使用对象的人无需关心这个对象从哪儿来,无需去配置一堆相关初始化参数。即使类被更改,使用者的代码也无需做任何更改和变动。

把整个类创建,初始化,注入到类,完全交给个容器完成,完成控制反转,这个就是依赖注入。

简单来说就是不需要new一个对象,而是通过参数传递进来,而这个对象的创建和初始化交个容器找相关配置完成。

Spring的依赖注入两种方式

构造函数、设置函数

构造函数

顾名思义,就是这些依赖的对象,通过构造函数的参数进行传入,xml配置通过以下2种方式配置:
类依赖:

<constructor-arg ref="bar"/>

值依赖:

<contructor-args type="" value=""/>

设置函数

顾明思议就是通过函数进行注入依赖,xml通过以下方式配置:
类依赖:

<property name="spellChecker" ref="spellChecker"/>

值依赖:

<property name="name" value="John Doe"/>

其他

内部beans

定义在类范围内<bean/>

<bean id="outerBean" class="...">
      <property name="target">
         <bean id="innerBean" class="..."/>
      </property>
   </bean>

注入集合

有时候注入的值可能是个集合 <list> <set> <map> <props>

元素描述
<list>它有助于连线,如注入一列值,允许重复。
<set>它有助于连线一组值,但不能重复。
<map>它可以用来注入名称-值对的集合,其中名称和值可以是任何类型。
<props>它可以用来注入名称-值对的集合,其中名称和值都是字符串类型。

xml配置:

<property name="addressList">
         <list>
            <value>INDIA</value>
            <value>Pakistan</value>
            <value>USA</value>
            <value>USA</value>
         </list>
</property>

Spring beans的自动装配

无需编写xml,自动适配,使用autowire属性,有5种模式

模式描述
no这是默认的设置,它意味着没有自动装配,你应该使用显式的bean引用来连线。你不用为了连线做特殊的事。在依赖注入章节你已经看到这个了。
byName由属性名自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byName。然后尝试匹配,并且将它的属性与在配置文件中被定义为相同名称的 beans 的属性进行连接。
byType由属性数据类型自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byType。然后如果它的类型匹配配置文件中的一个确切的 bean 名称,它将尝试匹配和连接属性的类型。如果存在不止一个这样的 bean,则一个致命的异常将会被抛出。
constructor类似于 byType,但该类型适用于构造函数参数类型。如果在容器中没有一个构造函数参数类型的 bean,则一个致命错误将会发生。
autodetectSpring首先尝试通过 constructor 使用自动装配来连接,如果它不执行,Spring 尝试通过 byType 来自动装配。

标签: 无

发表评论: