Spring实战(第四版) 第二章 装配Bean
在Spring中,对象无需自己查找或创建与其所关联的其他对象。相反,容器负责把需要相互协作的对象引用赋予各个对象。
1、Spring配置的可选方案
- 在XML中进行显式配置
- 在Java中进行显式配置
- 隐式的bean发现机制和自动装配
2、自动化装配bean
组件扫描(component scanning):Spring会自动发现应用上下文中所创建的bean。
自动装配(autowiring):Spring自动满足bean之间的依赖。
创建可被发现的bean
- @Component注解,表明该类会作为组件类,并告知Spring要为这个类创建bean。
import org.springframework.stereotype.Component;
@Component
public class SgtPeppers implements CompactDisc {
private String title = "Sgt. Pepper's Lonely Hearts Club Band";
private String artist = "The Beatles";
public void play() { System.out.println("Playing " + title + " by " + artist); }
}
- @ComponentScan,该注解能够在Spring中启用组件扫描,默认扫描与配置类相同的包。
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class CDPlayerConfig {
}
- @Autowired,将bean注入到代码中
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class CDPlayer implements MediaPlayer {
private CompactDisc cd;
@Autowired
public CDPlayer(CompactDisc cd) {
this.cd = cd;
}
public void play() {
cd.play(); }
}
设置组件扫描的基础包
- 类型不安全的设置
@Configuration
@ComponentScan(basePackages={"soundsystem", "video"})
public class CDPlayerConfig { }
- 指定类或接口
@Configuration
@ComponentScan(basePackageClasses={CDPlayer.class, DVDPlayer.class})
public class CDPlayerConfig {
}
通过为bean添加注解实现自动装配
- @Autowired有了这个注解之后,表明当Spring创建CDPlayer bean的时候,会通过这个构造器来进行实例化并传入一个可设置CompactDisc类型的bean。
- 它还可以用在属性的Setter方法上
@Autowired
public CDPlayer(CompactDisc cd) {
this.cd = cd;
}
3、通过Java代码装配bean
如果没办法用@Component @Autowired,比如要用第三方库中的组件
创建配置类
- 这里没有@ComponentScan,需要显示配置bean
import org.springframework.context.annotation.Configuration;
@Configuration public class CDPlayerConfig {
}
声明简单的bean
- 编写一个方法,这个方法会创建所需类型的实例,并将这个方法添加@Bean注解
- @Bean注解告诉Spring这个方法将会返回一个对象,该对象要注册成为Spring应用上下文中的bean
- https://zhuanlan.zhihu.com/p/145852514
@Bean
public CompactDisc sgtPeppers() {
return new SgtPeppers();
}
借助JavaConfig实现注入
- 引用创建bean
@Bean
public CDPlayer cdPlayer() {
return new CDPlayer(sgtPeppers());
}
- 如果两个bean都用了sgtPeppers(),会得到相同的实例
@Bean
public CDPlayer cdPlayer() {
return new CDPlayer(sgtPeppers());
}
@Bean
public CDPlayer anotherCDPlayer() {
return new CDPlayer(sgtPeppers());
}
- 这样,可以自动装配一个CompactDisc到配置方法中。它不会要求将CompactDisc申明到同一个配置类中。
@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc) {
return new CDPlayer(compactDisc);
}
浙公网安备 33010602011771号