在Spring中,对象无需自己查找和创建与其所关联的其他对象。相反,容易负责把需要相互协作的对象引用赋予各个对象。例如,一个订单管理的组件需要信用卡认证组件,但它不需要自己创建信用卡认证组件。订单管理组件只需要表明自己两手空空,容器就会主动赋予它一个信用卡认证组件。创建应用对象之间协作关系的行为通常称为装配,这也是依赖注入(DI)的本质。
Spring容器负责创建应用程序的bean并通过DI来协调这些对象之间的关系。但是,作为开发人员,你需要告诉Spring要创建那些bean并且如何将其装配在一起。当描述bean如何进行装配时,Spring具有非常大的灵活性,它提供了三种主要的装配机制:
- 在XML中进行显式配置;
- 在Java中进行显式配置;
- 隐式的bean发现机制和自动装配;
1.通过 XML 装配 bean
在 Spring 刚刚出现的时候,XML 是描述配置的主要方式。尽管长期以来确实与XML有着关联,但现在需要明确的是,XML不再是配置Spring的唯一的可选方案。Spring现在有了强大的自动化配置和基于Java的配置,XML不应该再是你的第一选择了。不过理解如何在Spring使用XML还是很重要的。希望你在新的项目中使用自动化配置和JavaConfig
最为简单的Spring XML配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context" >
</beans>
很容易竟能看出,这个基本的XML配置以及比同等功能的JavaConfig类复杂得多了。作为起步,在JavaConfig中所需要的只是@Configuration,但在使用XML时,需要在配置文件的顶部声明多XML模式文件,这些文件定义了配置Spring的XML的元素
2.声明一个简单的
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context" >
<!-- <bean> 元素类似于 JavaCofig 中的 @Bean 注解。 -->
<!-- 声明了一个很简单的 bean -->
<!-- 因为没有明确给定ID,默认 soundsystem.SgtPeppers#0-->
<!-- soundsystem.SgtPeppers #0-->
<!-- 包名.类名 “#0” 是一个计数的形式,用来区分相同类型的其他 bean -->
<!-- 如果你声明了另外一个 SgtPeppers,并且没有明确进行标识,那么它自动得到的 ID 将会是 “soundsystem.SgtPeppers#1” -->
<bean class="soundsystem.SgtPeppers" />
<!-- 因为明确给定ID, 该Bean的ID为compactDisc-->
<bean id="compactDisc" class="soundsystem.SgtPeppers" />
</beans>
3.借助构造器注入初始化bean
在SpringXml配置中,只有一种声明bean的方式:使用
但是在XML声明DI时,会有多种可选的配置方案和风格。具体到构造器注入,有两种基本的配置方案可供选择:
- constructor-arg 元素
- 使用 Spring 3.0 所引入的 c- 命名空间
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context" >
<!-- <bean> 元素类似于 JavaCofig 中的 @Bean 注解。 -->
<!-- 声明了一个很简单的 bean -->
<!-- 因为没有明确给定ID,默认 soundsystem.SgtPeppers#0-->
<!-- soundsystem.SgtPeppers #0-->
<!-- 包名.类名 “#0” 是一个计数的形式,用来区分相同类型的其他 bean -->
<!-- 如果你声明了另外一个 SgtPeppers,并且没有明确进行标识,那么它自动得到的 ID 将会是 “soundsystem.SgtPeppers#1” -->
<bean id="sgtPeppers" class="soundsystem.SgtPeppers" />
<!-- 因为明确给定ID, 该Bean的ID为compactDisc-->
<bean id="compactDisc" class="soundsystem.SgtPeppers" />
<bean id="cdPlayer" class="soundsystem.CDPlayer">
<constructor-arg ref="compactDisc" />
</bean>
<!--代替方案你也可以使用c-命名空间和模式声明-->
<!--模式声明 在顶部添加 xmlns:c="http://www.springframework.org/schema/c"-->
<!-- c:cd-ref="compactDisc -->
<!-- c: cd -ref="compactDisc -->
<!-- cd 构造器参数名 CompactDisc cd
public CDPlayer(CompactDisc cd){
this.cd = cd;
}
-->
<bean id="cdPlayer" class="soundsystem.CDPlayer" c:cd-ref="compactDisc" />
<!--替代的方案是我们使用参数在整个参数列表中的位置信息:-->
<!--该方法的第一个构造参数-->
<bean id="cdPlayer" class="soundsystem.CDPlayer" c:_0-ref="compactDisc" />
<!--将字面量注入到构造器中-->
<bean id="compactDisc" class="soundsystem.BlankDisc"
c:title="Sgt. Pepper's Lonely Hearts Club Band"
c:artist="The Beatles" />
<bean id="compactDisc" class="soundsystem.BlankDisc">
<constructor-arg value="Sgt. Pepper's Lonely Hearts Club Band" />
<constructor-arg value="The Beatles" />
</bean>
<bean id="compactDisc" class="soundsystem.BlankDisc"
c:_0="Sgt. Pepper's Lonely Hearts Club Band"
c:_1="The Beatles" />
<!--装配集合 构造器 list-->
<bean id="compactDisc"
class="soundsystem.BlankDisc"
c:_0="Sgt. Pepper's Lonely Hearts Club Band"
c:_1="The Beatles">
<constructor-arg>
<list>
<value>Sgt. Pepper's Lonely Hearts Club Band</value>
<value>With a Little Help from My Friends</value>
<value>Lucy in the Sky with Diamonds</value>
<value>Getting Better</value>
<value>Fixing a Hole</value>
</list>
</constructor-arg>
</bean>
<!--装配集合 构造器 set-->
<bean id="compactDisc" class="soundsystem.BlankDisc" >
<constructor-arg value="Sgt. Pepper's Lonely Hearts Club Band" />
<constructor-arg value="The Beatles" />
<constructor-arg>
<set>
<value>Sgt. Pepper's Lonely Hearts Club Band</value>
<value>With a Little Help from My Friends</value>
<value>Lucy in the Sky with Diamonds</value>
<value>Getting Better</value>
<value>Fixing a Hole</value>
<!-- ...other tracks omitted for brevity... -->
</set>
</constructor-arg>
</bean>
<!--假设你的构造器如下 public Discography(String artist, List<CompactDisc> cds) { ... }-->
<bean id="beatlesDiscography"
class="soundsystem.Discography" >
<constructor-arg value="Sgt. Pepper's Lonely Hearts Club Band"/>
<constructor-arg>
<list>
<ref bean="sgtPeppers" />
<ref bean="whiteAlbum" />
<ref bean="hardDaysNight" />
<ref bean="revolver" />
</list>
</constructor-arg>
</bean>
</beans>
标签:装配,XML,Spring,配置,bean,组件
From: https://www.cnblogs.com/guohongzhi/p/16648062.html