Spring配置的可选方案
Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系
此时
需要告诉Spring要创建哪些bean并且如何将其装配到一起
三种主要装配机制:
在XML中进行显示配置;
在Java中进行显示配置;
隐式的bean发现机制和自动装配;
如何选择?
可以自由互相搭配
尽可能使用自动配置的机制,显示配置越少越好。当必须要显示配置bean的时候(如:有些源码不是你来维护,而当你需要为这些代码配置bean的时候),推荐使用类型安全并且比XML更加强大的JavaConfig。当想要使用便利的XML命名空间,并且在JavaConfig中没有同样的实现时,才应该使用XML。
自动化装配Bean
Spring从两个角度来实现自动化装配
组件扫描:Spring会自动发现应用上下文中所创建的bean
自动装配:Spring自动满足bean之间的依赖
组件扫描和自动装配组合在一起就能够将显示配置降低到最少
注入类到bean中
@Component 这个注解表明该类会作为组建类,并告知Spring要为这个类创建bean。相当于配置文件中的
@Named可以作为@Component注解的替代方案,两者存在细微的差异,大多数场景中,可以互相替换
组件扫描
@ComponentScan注解启用了组件扫描
通过xml文件启动组件扫描
<context:component-scan base-package="soundsystem">
自动化装配
@Autowired,简单的说就是把其他bean中的某个方法注入到当前bean中
构造器上添加此注解,表明当Spring创建CDPlayer bean的时候,会通过这个构造器来进行实例化并且会传入一个可设置给CompactDisc类型的bean
实例:通过自动装配,将一个CompactDisc注入到CDPlayer中
@Component
public class CDPlayer implements MediaPlayer{
private CompactDisc cd;
@Autowired
public CDPlayer(CompactDisc cd){
this.cd = cd;
}
public void play(){
cd.play();
}
}
@Inject:来源于Java以来规范,该规范同时还为我们定义了@Named注解,,在自动装配中,Spring同时支持@Inject和@Autowired,尽管有一些细微的差异,大多数场景中,可以相互替换
显示装配
为什么使用显示装配?
有时候自动化装配方案行不通,因此需要明确配置Spring。比如:想将第三方库中的组件装配到你的应用中, 此时,是没有办法在它的类上添加@Component和@Autowired 注解的,因此就不能使用自动化装配的方案。
两种显示装配的方案:
Java和XML
导入混合配置:
有时会同时使用自动化和显示配置
在自动装配时,并不在意要装配的bean来自哪里。
自动装配的时候会考虑到Spring容器中所有的bean,不管是在JavaConfig或xml中声明的还是通过组件扫描获取的
如何在JavaConfig中引用XML配置的bean?
如何在XML配置文件中引用JavaConfig?