一、课程内容
上一讲,我们采用XML配置文件的方式使用Spring容器管理Bean对象,最后给出一个思考题:“如果我们有几十个类要创建Bean,采用XML配置方式,会不会让Spring配置文件显得很臃肿,怎么解决这个问题呢?”,这一讲,我们准备利用组件注解符精简Spring配置文件
二、打开项目【SpringDemo2020
三、利用组件注解符精简Spring配置文件
1、创建net.xl.spring.lesson02包
2、将lesson01子包的四个类拷贝到lesson02子包
3、修改杀龙任务类 - SlayDragonQuest
业务Bean的配置可用注解符:@Component - 组件 (@Service - 服务、@Repository - 仓库、@Mapper - 映射器、@Controller - 控制器)
4、修改救美任务类 - RescueDamselQuest
5、修改勇敢骑士类 - BraveKnight
6、修改救美骑士类 - DamselRescuingKnight
7、创建Spring配置文件
8、创建测试类 - TestKnight
在test/java里创建net.hw.spring.lesson2包,在包里创建TestKnight类
package net.xl.spirng.lesson02;
import net.xl.spring.lesson02.BraveKnight;
import net.xl.spring.lesson02.DamselRescuingKnight;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 功能:测试骑士类
* 作者:华卫
* 日期:2021年03月22日
*/
public class TestKnight {
private ClassPathXmlApplicationContext context; // 基于类路径XML配置文件的应用容器
@Before
public void init() {
// 基于Spring配置文件创建应用容器
context = new ClassPathXmlApplicationContext("xml_annotation/spring-config.xml");
}
@Test
public void testKnight() {
// 根据名称从应用容器里获取勇敢骑士对象
BraveKnight knight1 = (BraveKnight) context.getBean("Mike");
// 勇敢骑士执行任务
knight1.embarkOnQuest();
// 根据名称从应用容器里获取救美骑士对象
DamselRescuingKnight knight2 = (DamselRescuingKnight) context.getBean("damselRescuingKnight");
// 救美骑士执行任务
knight2.embarkOnQuest();
}
@After
public void destroy() {
// 关闭应用容器
context.close();
}
}
四、程序优化 - 面向接口
Spring框架可以方便地管理Bean及其相互依赖。为了模块之间实现松耦合,一般采用面向接口的方式。多种骑士,多种任务,可以任意搭配。为了实现这个效果,我们应该抽象出两个接口:骑士接口(Knight)和任务接口(Quest)。骑士接口有两个实现类:BraveKnight和DamselRescuingKnight;任务接口有两个实现类:SlayDragonQuest和RescueDamselQuest。
(一)创建任务接口 - Quest
(三)修改杀龙任务类 - SlayDragonQuest
(四)修改救美任务类 - RescueDamselQuest
(五)修改勇敢骑士类 - BraveKnight
(六)修改救美骑士类 - DamselRescuingKnight
(七)修改测试类 - TestKnight
package net.xl.spirng.lesson02;
import net.xl.spring.lesson02.BraveKnight;
import net.xl.spring.lesson02.DamselRescuingKnight;
import net.xl.spring.lesson02.Knight;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 功能:测试骑士类
* 作者:华卫
* 日期:2021年03月22日
*/
public class TestKnight {
private ClassPathXmlApplicationContext context; // 基于类路径XML配置文件的应用容器
@Before
public void init() {
// 基于Spring配置文件创建应用容器
context = new ClassPathXmlApplicationContext("xml_annotation/spring-config.xml");
}
@Test
public void testBraveKnight(){
Knight knight = (BraveKnight) context.getBean("Mike");
knight.embarkOnQuest();
}
@Test
public void testDamselRescuingKnight(){
Knight knight = (DamselRescuingKnight) context.getBean("damselRescuingKnight");
knight.embarkOnQuest();
}
@After
public void destroy() {
// 关闭应用容器
context.close();
}
}
(八)运行测试类 - TestKnight