- 创建对象之间的协作关系称为装配,这也就是依赖注入的本质
本篇内容
- 1、Spring自动化装配
- 2、实现组件扫描
- 3、bean实现自动化装配
1、Spring在装配方式有三种:
- 1、在Xml中进行显示配置
- 2、在java中进行显示配置
- 3、隐式的bean发现机制和自动化装配
2、自动化装配bean
- 1、组件扫描:Spring会自动发现应用上下文所创建的bean
- 2、自动装配:Spring自动满足bean之间的依赖
一、自动化装配
1、定义接口
public interface CompactDisc {
void play();
}
2、定义实现类
@Component
public class CDPlayer implements CompactDisc {
public void play() {
System.out.println("CD-Player playing ... ... ");
}
}
- 注解说明
- @Component:表明该类会作为组件类并告知Spring要为这个类创建bean
3、定义配置类
@Configuration
@ComponentScan
public class CDConfig {
}
- 说明:
- @ComponentScan:这个注解能够在Spring中启用组件扫描,默认会扫描与配置相同的包
4、测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDConfig.class)
public class CDPlayerTest {
@Autowired
private CompactDisc compactDisc;
@Test
public void getBean() {
compactDisc.play();
}
}
- 注解说明:
- 1、使用SpringJUnit4ClassRunner便于在测试的时候自动创建Spring的应用上下文
- 2、@ContextConfiguration:需要加载的配置
- 3、@Autowired将对象注入到代码中
5、为组件扫描的bean命名
- Spring应用上下文中所有的bean都有一个给定的ID,spring会根据类名给对象一个id,类名字母为小写
- 给类配置固定的id
5.1、使用@component
@Component("pagger")
public class CDPlayer implement CompactDisc{}
5.2、使用@Named
@Named("pagger")
public class CDPlayer implement CompactDis{}
二、设置组件扫描的基础包
@Configuration
@ComponentScan(“com.demo”)
public class CDPlayerConfig{}
- 说明:
- 1、@ComponentScan(“com.demo”):指定了扫描的基础包名称
- 2、@ComponentScan(basePackages=“com.demo”)使用这种方式更加清晰表示为包名
1、设置多个包扫描地址:
- basePackages是复数知道可以设置多个包名,但是设置多个包名是不安全的行为
@ComponentScan(basePackages={“com.demo.service”,“com.demo.dao”})
2、指定包中的类或接口
@ComponentScan(basePackageClasses={UserDao.class,UserService.class})
三、给bean实现自动装配
- 自动装配就是让Spring自动满足bean依赖的方法,在满足依赖的过程中会在Spring应用中寻找匹配某个bean需求的其他bean。
1、创建接口
public interface CompactDisc {
void play();
}
2、创建实现类
@Component
public class SgtPepper implements CompactDisc {
public void play() {
System.out.println("Sgt Pepper play ... ... ");
}
}
3、创建实现类
@Component
public class CDPlayer {
private CompactDisc compactDisc;
@Autowired
public CDPlayer(CompactDisc compactDisc) {
this.compactDisc = compactDisc;
}
public void play() {
compactDisc.play();
}
}
4、创建配置类
@Configuration
@ComponentScan
public class CDConfig {
}
5、测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDConfig.class)
public class CDPlayerTest {
@Autowired
private CompactDisc compactDisc;
@Autowired
private CDPlayer cdPlayer;
@Test
public void showBean(){
compactDisc.play();
}
@Test
public void getBean() {
cdPlayer.play();
}
}
6、CDPlayer其他方式注入
@Autowired
public void setCompactDisc(CompactDisc compactDisc) {
this.compactDisc = compactDisc;
}
@Autowired
public void initCompactDisc(CompactDisc compactDisc) {
this.compactDisc = compactDisc;
}
7、注意
- 1、如果没有匹配的bean在应用上下文创建时会抛出异常,为了避免异常可以给@Autowired添加属性
@Autowired(required=false)
- 2、使用@Inject注解代替Autowired
- Autowired是spring特有的注解,Inject是java规范的注解
代码地址:
https://github.com/brusion/brusion-code/tree/master/demo-java/03%20-%20demo%20-%20spring/spring-demo-study/01-di
网友评论