Spring bean装配的三种配置方式

Spring bean装配的三种配置方式

leo 572 2021-04-10

Spring bean装配的三种配置方式

  1. 在XML文件中显式配置
  2. 在Java代码中显式配置
  3. 隐式的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,类中有两个属性分别为namesinger分别表示这首歌的歌名歌手。这就完成了一个简单的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的组件扫描
开启组件扫描的方式有两种

  1. 使用@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);
}