今天我们介绍一下Spring三种装配机制中的另外两种装配方式:JavaConfigXML配置,这两种方式区别于自动化装配方式都属于显示装配。

1、Java代码装配bean

首先,我们通过在Config类中使用@Bean注解来声明bean;
@Bean注解会告诉Spring其注解的方法会返回一个对象,该对象要注册为Spring上下文中的bean。
@Bean(name = “id”) :我们可以通过这种方式设置bean的ID,例如一个ID名为“id”的bean。

@Configuration
public class CDPlayerConfiger {
    @Bean
     //通过该注解实现java代码装配bean
    public CompactDisc sgtPeppers(){
        return new SgtPeppers();
    }
    @Bean
    public CDPlayer cdPlayer(){
    	//依赖于 CompactDisc 的bean
        return new CDPlayer(sgtPeppers());
    }
}

在声明bean完成后,即可在测试中通过@Autowired注解实现自动注入或通过下面的代码

 ApplicationContext acx = new AnnotationConfigApplicationContext(CDPlayerConfiger.class);
 CDPlayer cdPlayer = (CDPlayer) acx.getBean("cdPlayer");

来获得bean。

注意: 在使用@Bean注解得到目标对象的bean这个过程好像是通过调用@bean注解的方法来实现的。
   实际上,在每次调用@bean注解的方法时,Spring会对其调用进行拦截,然后直接将Spring上下文中的bean实例(该实例也是通过调用方法实现的,但是仅调用一次)进行返回。也就是说不论调用几次最后得到的是同一个bean

   默认情况下:Spring中的bean都是单例的


/**
 *      这里得到的两个bean实际上是同一个bean
 */
    @Bean
    public CDPlayer cdPlayer(){
        return new CDPlayer(sgtPeppers());
    }
    @Bean
    public CDPlayer anotherCdPlayer(){
        return new CDPlayer(sgtPeppers());
    }

2、XML配置

XML配置是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">

	<bean id="compactDisc" class="soundsystem.collections.BlankDisc">
	    <constructor-arg value="Sgt. Pepper's Lonely Hearts Club Band" />
	    <constructor-arg value="The Beatles" />
	    <constructor-arg>
	      <list>
	        <value>Sgt. Pepper's Lonely Hearts Club Band</value>
	        <value>With a Little Help from My Friends</value>
	      </list>
	    </constructor-arg>
	 </bean>

	  <bean id="cdPlayer" class="soundsystem.CDPlayer">
	    <constructor-arg ref="compactDisc" />
	  </bean>
</beans>


在上面的配置文件中,我们看到:
1、可以通过<bean>标签来装配bean,我们可以设置id,并利用class=“全路径类名”的方式来声明bean;
2、我们可以借助<constructor-arg>元素来使用构造器注入初始化bean;value值为构造器输入参数(可以为list列表);
3、在ID为cdPlayer的bean的声明中,我们可以将一个ID为compactDisc的bean引用传给CDPlayer的构造器。

此外:我们还可以通过c- 命名空间和 p- 命名空间来实现构造器注入设置属性;在使用命名空间时,需要我们进行如下声明:

		xmlns:c="http://www.springframework.org/schema/c"
		xmlns:p="http://www.springframework.org/schema/p"

这里我们不再做过多介绍XML配置。

10-06 13:03