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的更多相关文章

  1. spring实战二之Bean的自动装配(非注解方式)

    Bean的自动装配 自动装配(autowiring)有助于减少甚至消除配置<property>元素和<constructor-arg>元素,让Spring自动识别如何装配Bea ...

  2. Spring学习(二)--装配Bean

    一.Spring装配机制 Spring提供了三种主要的装配机制: 1.在XML中进行显示配置 2.在Java中进行显示配置 3.隐式的bean发现机制和自动装配--自动化装配bean Spring可以 ...

  3. spring实战三装配bean之Bean的作用域以及初始化和销毁Bean

    1.Bean的作用域 所有的spring bean默认都是单例.当容器分配一个Bean时,不论是通过装配还是调用容器的getBean()方法,它总是返回Bean的同一个实例.有时候需要每次请求时都获得 ...

  4. Spring实战之装配Bean

    1.1Spring配置的可选方案 Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系.但是,作为开发人员,你需要告诉Spring要创建哪些bean并且如何将其装配在一起.当 ...

  5. Spring总结 1.装配bean

    本随笔内容要点如下: 依赖注入 Spring装配bean的方式 条件化装配 一.依赖注入 我理解的依赖注入是这样的:所谓的依赖,就是对象所依赖的其他对象.Spring提供了一个bean容器,它负责创建 ...

  6. Spring 之自动化装配 bean 尝试

    [Spring之自动化装配bean尝试] 1.添加dependencies如下所示(不是每一个都用得到 <dependencies> <dependency> <grou ...

  7. spring中自动装配bean

    首先用@Component注解类: package soundsystem: import org.springframework.stereotype.Component; @Component p ...

  8. spring的自动装配Bean与自动检测Bean

    spring可以通过编写XML来配置Bean,也可以通过使用spring的注解来装配Bean. 1.自动装配与自动检测: 自动装配:让spring自动识别如何装配bean的依赖关系,减少对<pr ...

  9. spring学习总结——装配Bean学习二(JavaConfig装配bean)

    通过Java代码装配bean 前言:上面梳理了通过注解来隐式的完成了组件的扫描和自动装配,下面来学习下如何通过显式的配置的装配bean: 使用场景:比如说,你想要将第三方库中的组件装配到你的应用中,在 ...

  10. spring实战四之Bean的自动装配(注解方式)

    使用注解装配: 从spring2.5开始,Spring启用了使用注解自动装配Bean的属性,使用注解方式自动装配与在XML中使用 autowire 属性自动装配并没有太大区别,但是使用注解方式允许更细 ...

随机推荐

  1. 容器数据库(CDB)和传统的非容器数据库的区别

    传统的非容器数据库在系统元数据和实例资源没有进行任何共享.容器数据库把 Oracle 提供的元数据.后台进程以及内存结构进行共享,把每个部门数据库的存储结构以 PDB 的形式独立出来,从而实现了系统资 ...

  2. mysql数据库随笔

    number(p,s):数值型,包括小数点前后的位数Integer:整数vachar2:字符串nvachar2:国际化使用字符串char:data:日期timestamp:时间戳BLOB:放大数据 事 ...

  3. The Little Book of Rust Books

    https://lborb.github.io/book/title-page.html https://blog.logrocket.com/unsafe-rust-how-and-when-not ...

  4. CentOS7 进入修复模式的办法

    有时候配置Centos文件修改错误会导致系统无法登录,可以通过修复模式进行单用户运行模式,进行修复. 具体操作如下: 1.重启服务器,在选择内核界面使用上下箭头移动 2.选择内核并按"e&q ...

  5. Blog作业01

    目录 前言 设计与分析 踩坑心得 改进建议 总结 前言 这三次作业的知识点覆盖的很全面,从最开始的int赋值变量,循环,到Boolean值,sort等一些函数,到后来的对象,类的创建和声明,gette ...

  6. SQL SERVER 2014 双机热备操作流程-数据库双向同步 (第二篇:订阅)

    1.登录从服务器数据库,从数据库左侧菜单栏找到->复制->本地订阅->右击新建订阅->选择查找SQL Server 发布服务器,数据库服务器名称要是主服务器计算机名称,输入登录 ...

  7. vim的visual模式和列编辑

    有三种方式进入visual模式: 1> 在普通模式下输入v(小写),底部提示信息为VISUAL,编辑粒度为字符 通过方向键或者HJKL调整选择的字符范围. 输入d,删除选中字符: 输入y,复制当 ...

  8. 使用loadrunner运行中问题(无代码生成解决方法)

    开始录制之后,不能成功录制,工具栏events一直是2,打开新网站不跳动,结束录制之后没有代码生成 进入软件,点击工具栏的录制,选择录制选项,将http高级如下设置 同时也要修改套接字,如下配置 当开 ...

  9. ls和mkdir

    ls  查看当前目录的内容 1) ls -l 显示详细列表 2) Ls -lh 吧文件大小以人性化的方式展开 3) ls -a 显示所有的文件,包括隐藏文件,隐藏文件是已.开头的文件 4) ll 等于 ...

  10. beta冲刺:总结随笔

    这个作业属于哪个课程 <班级的链接> 这个作业要求在哪里 <作业要求的链接> 这个作业的目标 beta冲刺总结 作业正文 .... 其他参考文献 ... 一.预期计划 | 6. ...