Spring bean装配的三种配置方式
- 在XML文件中显式配置
- 在Java代码中显式配置
- 隐式的bean发现机制和自动装配
1.XML文件中显式配置
在项目src
目录下创建一个名为applicationContext.xml
的配置文件作为Spring的配置文件 ,
内容如下
<?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 name="music" class="com.zys.spring.config.bean.Music" >
<property name="name" value="Baby" ></property>
<property name="singer" value="Justin-Bieber" ></property>
</bean>
</beans>
上面的XML文件配置了一个名为music
的bean,对应的类为com.zys.spring.config.bean.Music
,类中有两个属性分别为name
和singer
分别表示这首歌的歌名
和歌手
。这就完成了一个简单的bean的配置。
Music
类对应代码如下:
package com.zys.spring.config.bean;
import org.springframework.stereotype.Component;
public class Music {
private String name;
private String singer;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSinger() {
return singer;
}
public void setSinger(String singer) {
this.singer = singer;
}
@Override
public String toString() {
return "Music{" +
"name='" + name + '\'' +
", singer='" + singer + '\'' +
'}';
}
}
创建一个测试类SpringConfigTest
,内容如下:
package com.zys.spring.config.test;
import com.zys.spring.config.bean.Music;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringConfigTest {
@Test
public void testfun(){
//创建上下文容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器获取名为'music'的对象
Music music = (Music) ac.getBean("music");
//输出music对象
System.out.println(music);
}
}
测试结果如下:
2.Java代码中显式配置
在Music
类前面加上@Component注解,声明这个类将作为组件类,并告知Spring为这个类创建bean,名为music
。
@Component("music)
public class Music {
... ...
}
注意,使用@Component注解的同时需要开启Spring的组件扫描
开启组件扫描的方式有两种
- 使用@ComponentScan注解
创建一个空类用于开启组件扫描:
package com.zys.spring.config.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
//开启组建扫描,并指定扫描的基础包为"com.zys.spring.config"(会扫描此包下的所有包)
@Configuration
@ComponentScan(basePackages = "com.zys.spring.config")
public class MusicConfig {
}
注意:@Configuration注解表示这个类为配置类
2. 使用XML文件配置
在applicationContext.xml
文件中添加下面的语句
<context:component-scan base-package="com.zys.spring.config"></context:component-scan>
注意:需要导入context
命名空间,此时配置文件applicationContext.xml
内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd ">
<context:component-scan base-package="com.zys.spring.config"></context:component-scan>
</beans>
测试类SpringConfigTest
不变,结果如下:
3.隐式的bean发现机制和自动装配
通过上面任意一种方式声明bean,在需要用到bean的地方使用@Autowired注解开启自动装配。
在测试类SpringConfigTest
中声明一个成员变量music,使用@Autowired注解,代码如下:
package com.zys.spring.config.test;
import com.zys.spring.config.bean.Music;
import com.zys.spring.config.config.MusicConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
//使用Spring集成的JUnit来进行测试
//@RunWith 让测试运行于Spring测试环境
//@ContextConfiguration 指定配置类列表
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MusicConfig.class)
public class SpringConfigTest {
//开启自动装配
@Autowired
private Music music;
@Test
public void testfun(){
//创建上下文容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器获取名为'music'的对象
Music music = (Music) ac.getBean("music");
//输出music对象
System.out.println(music);
}
@Test
public void testfun2(){
//直接输出music对象
System.out.println(music);
}
}
上面使用的是Spring集成的JUnit来进行测试,可以帮我们创建好容器,所以只需调用testfun2
方法进行测试,结果如下:
注意:@Autowired注解不仅可以添加在==成员变量==上,还可以添加在==setter==、==构造器==......等等上面,可以说是任何类中的方法上都可以用。
例如:
@Autowired
public void setMusic(Music music) {
this.music = music;
}
@Autowired
public void playMusic(Music music) {
MediaPlayer.play(music);
}