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);
}

posted on 2021-12-05 17:56  kaiker  阅读(11)  评论(0)    收藏  举报