本文是学习JavaEE开发的记录笔记
大纲
装配Bean
- Bean对象:Java中的对象
- 装配Bean:Spring中创建Bean对象并为这个对象注入依赖的过程
- 装配Bean方式:
- 隐式的Bean发现机制和自动装配
- 在Java中显式的配置
- 在XML中显式的配置
使用@Configuration构建配置类
配置类:@Configuration用于定义配置类,配置类内部包含有一个或多个被@Bean注解的方法,可用于替换XML配置文件,用于构建Bean定义,初始化Spring IOC容器
- 创建一个配置类文件,如AppConfig,添加注解@Configuration表明这是一个配置类
- 为配置类添加注解@ComponentScan组件扫描自动发现@component创建的类
- 主类,如ApplicationSpring类中的main方法初始化Spring容器对象就可以用配置类初始化,如ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
引入Junit单元测试
- 添加依赖:
- 添加测试代码:
- 在src/test/java/中创建与被测试模块所在包相同名称的包
- 在包下创建测试类,如AppTest
- 在测试类内部添加测试方法,如testPrintMessage()并在方法名上添加注解@Test表明这是一个测试方法
- 针对需要测试的对象方法,编写测试代码,如
- 引入Spring的测试模块简化单元测试:
- 添加依赖:
- 添加注解@RunWith(SpringJUnit4ClassRunner.class)自动初始化Spring IOC容器上下文环境
- 添加注解@ContextConfiguration(classes=AppConfig.class)自动加载配置类
- 直接在测试类中注入测试的类对象并添加注解@Autowired自动装配类对象
- 测试代码简化成如下
@Autowired注解
- 使用场景:
- 有参构造函数(最优):
- 成员变量:
- setter方法:
- 任意方法:
- require属性:@Autowired(required=false)注解表示,这个类对象的装配不是必须的,即没有这个类对象程序也可以执行相应的逻辑(需要非空判定)
- 接口类装配的歧义:在面向接口开发时,若接口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注解
基于配置类的自动装配
- 配置类的注解:
- @Configuration
- 配置类的组件扫描配置:
- 使用注解@ComponentScan(扫描单个包字符串)规定扫描组件所在的包范围,如@ComponentScan(“hello”)
- 使用注解@ComponentScan(basePackages={扫描多个包字符串数组})规定扫描组件所在的包范围,如@ComponentScan(basePackages={“hello.dao”,”hello.service”,”hello.web”})
- 使用注解@ComponentScan(basePackageClasses={扫描类字符串数组})规定扫描组件所在的包范围,如@ComponentScan(basePackages={“HelloDao.class”,”HelloService.class”,”HelloController.class”})
- 测试类指定配置类:
- @ContextConfiguration(classes=AppConfig.class)
基于XML配置文件的自动装配
- 在src/main/java/resources创建Spring配置文件applicationContext.xml,自动生成的beans标签相当于@Configuration注解
- 添加context:component-scan标签相当于@ComponentScan注解:
- 扫描单个包:
- 扫描多个包:
- 测试类指定XML配置文件:
- @ContextConfiguration(classespath:applicationContext.xml)