JavaEE学习(六) Spring中的Bean装配

本文是学习JavaEE开发的记录笔记

大纲

装配Bean

  • Bean对象:Java中的对象
  • 装配Bean:Spring中创建Bean对象并为这个对象注入依赖的过程
  • 装配Bean方式:
    • 隐式的Bean发现机制和自动装配
    • 在Java中显式的配置
    • 在XML中显式的配置

使用@Configuration构建配置类

配置类:@Configuration用于定义配置类,配置类内部包含有一个或多个被@Bean注解的方法,可用于替换XML配置文件,用于构建Bean定义,初始化Spring IOC容器

  1. 创建一个配置类文件,如AppConfig,添加注解@Configuration表明这是一个配置类
  2. 为配置类添加注解@ComponentScan组件扫描自动发现@component创建的类
  3. 主类,如ApplicationSpring类中的main方法初始化Spring容器对象就可以用配置类初始化,如ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

引入Junit单元测试

  1. 添加依赖:
  2. 添加测试代码:
    • src/test/java/中创建与被测试模块所在包相同名称的包
    • 在包下创建测试类,如AppTest
    • 在测试类内部添加测试方法,如testPrintMessage()并在方法名上添加注解@Test表明这是一个测试方法
    • 针对需要测试的对象方法,编写测试代码,如
  3. 引入Spring的测试模块简化单元测试:
    • 添加依赖:
    • 添加注解@RunWith(SpringJUnit4ClassRunner.class)自动初始化Spring IOC容器上下文环境
    • 添加注解@ContextConfiguration(classes=AppConfig.class)自动加载配置类
    • 直接在测试类中注入测试的类对象并添加注解@Autowired自动装配类对象
    • 测试代码简化成如下

@Autowired注解

  1. 使用场景:
    • 有参构造函数(最优):
    • 成员变量:
    • setter方法:
    • 任意方法:
  2. require属性:@Autowired(required=false)注解表示,这个类对象的装配不是必须的,即没有这个类对象程序也可以执行相应的逻辑(需要非空判定)
  3. 接口类装配的歧义:在面向接口开发时,若接口A被类B、C实现,此时使用自动装配@Autowire注解类对象A,Spring IOC容器无法确认使用B还是C对象装配A,解决方案如下
    • 声明实现类对象而不是接口类对象:最基本的解决方法,但在面向接口编程时较不适用
    • 首选Bean:使用@primary注解表示类对象为首选Bean对象,如对类B使用注解@primary,则对对象A的装配首选使用类B的对象,但在需要根据不同情况选用不同Bean对象时不适用
    • 限定符:对实现类使用@Qualifier(标识字符串),在装配接口对象时使用相应的@Qualifier(标识字符串),就可以选择装配接口类的实现类对象
    • 类ID:对实现类使用@Component(类ID字符串),在装配接口对象时使用相应的@Qualifier(类ID字符串)或者使用默认类ID@Qualifier(首字母小写的类名),就可以选择装配接口类的实现类对象
    • jdk解决方案:对实现类使用@Component(类ID字符串),在装配接口对象时使用Resource(name=类ID字符串/默认首字母小写类ID),可替代@Autowired+@Qualifier注解

基于配置类的自动装配

  1. 配置类的注解:
    • @Configuration
  2. 配置类的组件扫描配置:
    • 使用注解@ComponentScan(扫描单个包字符串)规定扫描组件所在的包范围,如@ComponentScan(“hello”)
    • 使用注解@ComponentScan(basePackages={扫描多个包字符串数组})规定扫描组件所在的包范围,如@ComponentScan(basePackages={“hello.dao”,”hello.service”,”hello.web”})
    • 使用注解@ComponentScan(basePackageClasses={扫描类字符串数组})规定扫描组件所在的包范围,如@ComponentScan(basePackages={“HelloDao.class”,”HelloService.class”,”HelloController.class”})
  3. 测试类指定配置类:
    • @ContextConfiguration(classes=AppConfig.class)

基于XML配置文件的自动装配

  1. src/main/java/resources创建Spring配置文件applicationContext.xml,自动生成的beans标签相当于@Configuration注解
  2. 添加context:component-scan标签相当于@ComponentScan注解:
    • 扫描单个包:
    • 扫描多个包:
  3. 测试类指定XML配置文件:
    • @ContextConfiguration(classespath:applicationContext.xml)