【书籍阅读】【Spring实战】二 装配Bean
Spring配置的可选方案
①自动化装配Bean:@Component
②Java代码装配Bean:@Bean
③XML装配Bean
自动化装配Bean
Spring从两个角度实现对 @Component组件 的自动化装配:
①组件扫描:Xml或者JavaConfig配置
②自动装配:@AutoWire
创建可以被发现的Bean
创建一个CompactDisc接口 CompactDisc.java
public interface CompactDisc {
void play();
}
创建CompactDisc的接口实现类
@Component
public class BeautifulWorld implements CompactDisc{
private String title = "BeautifulWorld";
private String artist = "Hikaru";
@Override
public void play() {
System.out.println("Playing " + title + " by " + artist);
}
}
@Component组件注解标识其能够加入SpringIOC容器
开启组件扫描 使IOC能够检测到Bean
①通过xml开启:
<context:component-scan base-package="hikaru"/>
测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring.xml")
public class CompactDiscTest {
@Autowired
private CompactDisc compactDisc;
@Test
public void play() {
compactDisc.play();
}
}
@RunWith标识让测试处于SpringTest测试环境下,否则不能够使用IOC容器中的Bean
@ContextConfiguration:location 则是加载Spring配置文件
②通过Java @ComponentScan开启:
ComponentScan参数默认有两种设置方式:
第一种是通过value,并且value可以省略,也可以替换为basePackages但是这种直接写String值的方式不安全
@Configuration
@ComponentScan(value = {"hikaru.entity"})
public class JavaConfig {
}
第二种是basePackageClasses
@Configuration
@ComponentScan(basePackageClasses = CompactDisc.class)
public class JavaConfig {
}
测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = JavaConfig.class)
public class CompactDiscTest {
@Autowired
private CompactDisc compactDisc;
@Test
public void play() {
compactDisc.play();
}
}
@ContextConfiguration classes表明使用的Spring配置文件
结果:
Playing BeautifulWorld by Hikaru
@AutoWire自动装配
上面测试中就使用了AutoWire自动装配,除此外自动装配也可以用于构造器和方法,Spring会自动对其参数添加@AutoWire注解。
为组件扫描的Bean命名
Spring会自动为Bean设置ID,默认值为类名的第一个字母小写,可以通过@Component(value = "id")进行修改。
如下有两种Bean注入了IOC:
@Component("BW")
public class BeautifulWorld implements CompactDisc{
private String title = "BeautifulWorld";
private String artist = "Hikaru";
@Override
public void play() {
System.out.println("Playing " + title + " by " + artist);
}
}
@Component("CTY")
public class CloseToYou implements CompactDisc{
private String title = "CloseToYou";
private String artist = "Hikaru";
@Override
public void play() {
System.out.println("Playing " + title + " by " + artist);
}
}
这时出现了Bean不唯一的情况导致装配失败:

通过@Qualifier选择指定ID的Bean
@Autowired
@Qualifier("BW")
private CompactDisc compactDisc;
如此便装配成功了
通过Java代码装配Bean
移除掉@ComponentScan注解扫描,在JavaConfig文件中直接通过@Bean注解告诉Spring该方法返回的对象要注册成为应用上下文中的Bean。
@Configuration
//@ComponentScan(basePackageClasses = {CompactDisc.class})
public class JavaConfig {
@Bean
public CompactDisc BeautifulWorld() {
return new BeautifulWorld();
}
}
测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = JavaConfig.class)
public class CompactDiscTest {
@Autowired
CompactDisc compactDisc;
@Test
public void test() {
compactDisc.play();
}
}
看起来每次自动装配的时候都调用了BeautifulWorld,但是实际上Spring会拦截BeautifulWorld方法的调用,然后返回第一次调用得到的Bean,因此每次装配得到的Bean都是同一个Bean,即Bean是单例的
通过XML装配Bean
略
导入和混合配置
在JavaConfig中引用XML配置
@Import(xxxxconfig.class) :引用其他的JavaConfig
@ImportResource("classpath:xxxx.xml"):引用xml配置
@Configuration
@ImportResource("classpath:spring.xml")
//@ComponentScan(basePackageClasses = {CompactDisc.class})
public class JavaConfig {
}
测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = JavaConfig.class)
public class CompactDiscTest {
@Autowired
CompactDisc compactDisc;
@Test
public void test() {
compactDisc.play();
}
}
JavaConfig并没有开启注解扫描,但是测试能够通过
在XML中引用JavaConfig配置
<bean class="hikaru.config.JavaConfig"> :在XML中引用JavaConfig配置
<import resource="classpath:spring.xml"/> :在xml中引入其他xml配置
【书籍阅读】【Spring实战】二 装配Bean的更多相关文章
- spring实战二之Bean的自动装配(非注解方式)
Bean的自动装配 自动装配(autowiring)有助于减少甚至消除配置<property>元素和<constructor-arg>元素,让Spring自动识别如何装配Bea ...
- Spring学习(二)--装配Bean
一.Spring装配机制 Spring提供了三种主要的装配机制: 1.在XML中进行显示配置 2.在Java中进行显示配置 3.隐式的bean发现机制和自动装配--自动化装配bean Spring可以 ...
- spring实战三装配bean之Bean的作用域以及初始化和销毁Bean
1.Bean的作用域 所有的spring bean默认都是单例.当容器分配一个Bean时,不论是通过装配还是调用容器的getBean()方法,它总是返回Bean的同一个实例.有时候需要每次请求时都获得 ...
- Spring实战之装配Bean
1.1Spring配置的可选方案 Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系.但是,作为开发人员,你需要告诉Spring要创建哪些bean并且如何将其装配在一起.当 ...
- Spring总结 1.装配bean
本随笔内容要点如下: 依赖注入 Spring装配bean的方式 条件化装配 一.依赖注入 我理解的依赖注入是这样的:所谓的依赖,就是对象所依赖的其他对象.Spring提供了一个bean容器,它负责创建 ...
- Spring 之自动化装配 bean 尝试
[Spring之自动化装配bean尝试] 1.添加dependencies如下所示(不是每一个都用得到 <dependencies> <dependency> <grou ...
- spring中自动装配bean
首先用@Component注解类: package soundsystem: import org.springframework.stereotype.Component; @Component p ...
- spring的自动装配Bean与自动检测Bean
spring可以通过编写XML来配置Bean,也可以通过使用spring的注解来装配Bean. 1.自动装配与自动检测: 自动装配:让spring自动识别如何装配bean的依赖关系,减少对<pr ...
- spring学习总结——装配Bean学习二(JavaConfig装配bean)
通过Java代码装配bean 前言:上面梳理了通过注解来隐式的完成了组件的扫描和自动装配,下面来学习下如何通过显式的配置的装配bean: 使用场景:比如说,你想要将第三方库中的组件装配到你的应用中,在 ...
- spring实战四之Bean的自动装配(注解方式)
使用注解装配: 从spring2.5开始,Spring启用了使用注解自动装配Bean的属性,使用注解方式自动装配与在XML中使用 autowire 属性自动装配并没有太大区别,但是使用注解方式允许更细 ...
随机推荐
- 解决Win7、Win10登录远程桌面连接时报错、提示“要求的函数不受支持”问题
解决Win7.Win10登录远程桌面连接时报错.提示"要求的函数不受支持"问题远程登录主机时地址,用户名,密码均正确,但是提示错误"要求的函数不受支持": 解决 ...
- C# 锁汇总
一.前言 本文章汇总c#中常见的锁,基本都列出了该锁在微软官网的文章,一些不常用的锁也可以参考微软文章左侧的列表,方便温习回顾. 二.锁的分类 2.1.用户模式锁 1.volatile 关键字 vol ...
- 如何在Windows下使用WebMatrix+IIS开发PHP程序
最近接收一个新项目,领导要求对客户端的接口采用PHP开发,为了方便,我就采用 Windows7专业版64位 + IIS7.5 + PHP5.5 + WebMatrix 作为开发环境进行开发: 首先下载 ...
- JAVA 学习打卡 day2
2022-04-23 16:43:32 1.字符类型 (1)字符和整型之间的相互转换 给字符变量赋值可以使用数值和字符,它们都可以使程序正确地运行.要注意的是,字符要用一对单引号('')括起 (2)常 ...
- 量化交易-可视化展示(grafana)
先上图 简单的实现了一下,效果还好,可玩性强 大概部署mysql+grafana step 1: 服务器:阿里云,ucloud啥的随意,配置也不需要什么,我的是阿里云1核1GB,足以 我用的ubunt ...
- Redis5.0.4-集群(单机版)搭建
最近尝试搭建了一下redis集群,这里记录一下,最后附上的是参考的博客地址. 安装C语言编译环境GCC yum install -y gcc-c++ 下载redis并编译安装 下载: wget htt ...
- Docker安装(win10)
Docker安装 windows 首先开启Hyper-V Hyper-V 是微软开发的虚拟机,类似于 VMWare 或 VirtualBox,仅适用于 Windows 10.这是 Docker Des ...
- UIPath踩坑记一 对 COM 组件的调用返回了错误 HRESULT E_FAIL。UiPath.UiNodeClass.InjectAndRunJS
[ERROR] [UiPath.Studio] [1] 错误: System.Exception: 对 COM 组件的调用返回了错误 HRESULT E_FAIL. ---> System.Ex ...
- Vue 解决先渲染 暂无数据
// 组件 data(){ return { data:null // 设置默认值为null } } // template <div v-show="data != null&quo ...
- 安装Win11需要网络才能下一步怎么跳过
1.先Shift+F10打开命令提示符 2.运行C:\Windows\System32\oobe\BypassNRO.cmd 3.自动重启来到联网这一步,多了一个没有网络的选项,进入.