前言
javaBean的三种配置方式:
- 基于XML的配置方式;
- 基于注解的配置方式;
- 基于Java类的配置方式。
之前可能使用最多的可能就是基于注解的配置方式了,基于XML的配置方式太多臃肿,而Java类的配置方式其实在一定程度上取代了xml的配置方式,特别实在SpringBoot中已经完全采用了Java类的配置方式。Java类的配置方式就是声明一个Java类来配置bean。
下面,开始一个基于Java类配置bean:
一、打开项目
二、采用Java配置类管理Bean
1.在main/java下创建net.tp.lesson04
2.在lesson04子包里创建SlayDragonQuest
package net.tp.spring.lesson04;
public class SlayDragonQuest {
public void embark(){
System.out.println("执行杀龙任务");
}
}
3、在lesson04下创建BraveKnight
package net.tp.spring.lesson04;
public class BraveKnight {
private SlayDragonQuest slayDragonQuest;
public void setSlayDragonQuest(SlayDragonQuest slayDragonQuest) {
this.slayDragonQuest = slayDragonQuest;
}
public void embarkOnQuest() {
slayDragonQuest.embark();
}
}
4、在lesson04下创建 SpringConfig
package net.tp.spring.lesson04;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration // 表明是Spring配置类
public class SpringConfig {
@Bean // 基于SlayDragonQuest类创建名为slayDragonQuest的Bean
public SlayDragonQuest slayDragonQuest() {
return new SlayDragonQuest();
}
@Bean("Mike") // 基于BraveKnight类创建名为braveKnight的Bean
public BraveKnight braveKnight() {
BraveKnight braveKnight = new BraveKnight();
braveKnight.setSlayDragonQuest(slayDragonQuest());
return braveKnight;
}
}
解释下@Configuration,@ComponentScan(basePackages=“包路径”),@Bean:
@Configuration:这个注解其实就是把我们当前的这个类,声明为一个配置文件,它就相当于我们的xml配置文件,跟它的作用是一样的,只不过用类的方式来进行展现;
@ComponentScan(basePackages=“包路径”):这个注解其实就是去扫描我们的包路径,对我们需要扫描的包进行扫描,如果需要扫描多个包,之间用逗号隔开即可;除此之外,还可以指定某一个具体的类,
@Bean:这个注解其实更好理解,它就相当于xml中的,我们之前通过标签将它注入到容器中,现在只需要在你所需要注入的资源上面加上@Bean注解,就可以注入到Spring容器中。
5、创建测试类—TestKnight
package net.tp.spring.lesson04;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class TestKnight {
private AnnotationConfigApplicationContext context; // 基于注解配置类的应用容器
@Before
public void init() {
// 基于注解配置类创建应用容器
context = new AnnotationConfigApplicationContext(SpringConfig.class);
}
@Test
public void testBraveKnight() {
// 根据名称从应用容器里获取勇敢骑士对象
BraveKnight knight = (BraveKnight) context.getBean("Mike");
// 勇敢骑士执行任务
knight.embarkOnQuest();
}
@After
public void destroy() {
// 关闭应用容器
context.close();
}
}
6、运行效果
三、课堂作业
1、创建救美任务类和救美骑士类
package net.tp.spring.lesson04;
/**
*功能:拯救少女骑士类
*/
public class DamselRescuingKnight {
private RescueDamselQuest rescueDamselQuest;
public DamselRescuingKnight(RescueDamselQuest rescueDamselQuest) {
this.rescueDamselQuest = rescueDamselQuest;
}
public void embarkOnQuest() {
rescueDamselQuest.embark();
}
}
package net.tp.spring.lesson04;
/**
*功能:拯救少女任务类
*/
public class RescueDamselQuest {
public void embark() {
System.out.println("执行拯救少女任务。");
}
}
2、修改Spring配置类 - 管理救美任务Bean和救美骑士Bean
package net.tp.spring.lesson04;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration // 表明是Spring配置类
public class SpringConfig {
@Bean // 基于SlayDragonQuest类创建名为slayDragonQuest的Bean
public SlayDragonQuest slayDragonQuest() {
return new SlayDragonQuest();
}
@Bean("Mike") // 基于BraveKnight类创建名为braveKnight的Bean
public BraveKnight braveKnight() {
BraveKnight braveKnight = new BraveKnight();
braveKnight.setSlayDragonQuest(slayDragonQuest());
return braveKnight;
}
@Bean
public DamselRescuingKnight damselRescuingKnight() {
DamselRescuingKnight damselRescuingKnight = new DamselRescuingKnight(rescueDamselQuest());
return damselRescuingKnight;
}
private RescueDamselQuest rescueDamselQuest() {
return new RescueDamselQuest();
}
}
3、在测试类TestKnight里创建测试方法 - testDamselRescuingKnight()
package net.tp.spring.lesson04;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class TestKnight {
private AnnotationConfigApplicationContext context; // 基于注解配置类的应用容器
@Before
public void init() {
// 基于注解配置类创建应用容器
context = new AnnotationConfigApplicationContext(SpringConfig.class);
}
@Test
public void testBraveKnight() {
// 根据名称从应用容器里获取勇敢骑士对象
BraveKnight knight = (BraveKnight) context.getBean("Mike");
// 勇敢骑士执行任务
knight.embarkOnQuest();
}
@Test
public void testDamselRescuingKnight(){
//根据拯救少女骑士类 从应用容器里获取拯救少女骑士对象
DamselRescuingKnight damselRescuingKnight =context.getBean(DamselRescuingKnight.class);
//拯救少女骑士执行任务
damselRescuingKnight.embarkOnQuest();
}
@After
public void destroy() {
// 关闭应用容器
context.close();
}
}
4、执行测试方法 - testDamselRescuingKnight()
类上添加注解,交给Spring维护
- @Component(“goods”) //通用方式,不推荐使用
- @Repository、@Service、@Controller,它们分别对应存储层Bean,业务层Bean,和展示层Bean。
依赖注入
可以加载属性上,也可以加载set方法和构造方法上
- @Autowired默认按类型自动装配
- @Autowired@Qualifier(“bean的名字例如goods”)按名字自动装配
- 加在构造方法上时@Qualifier加在参数前面
作用域注解
加在类上
- @Scope(“singleton,prototype,request,session”)
支持JSR-250 定义注解 - @Resource
- @Resource 的作用相当于 @Autowired,只不过 @Autowired 按 byType 自动注入,面@Resource 默认按 byName 自动注入
- @Resource 有两个属性是比较重要的,分别是 name 和 type,Spring 将- @Resource 注释的 name 属性解析为 Bean 的名字,而 type 属性则解析为 Bean 的类型