什么是依赖注入
从博主的理解就是,一般情况下我们创建对象会直接用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,则一个致命错误将会发生。 |
autodetect | Spring首先尝试通过 constructor 使用自动装配来连接,如果它不执行,Spring 尝试通过 byType 来自动装配。 |