基于Java类配置的Bean的装配
在大多数情况下,通过组件扫描和自动装配实现Spring的自动化配置是更为推荐的方式,但是有时候,自动化配置的方案行不通,需要明确配置Spring。比如你想要将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上添加@Component和@Autowired注解的,所以就不能使用自动化装配的方案了。
使用显示装配的方式有两种可行方案,Java和XML,XML前面已经详细介绍过了,现在我们来看看如何使用Java类进行配置。
创建配置类
在进行显示配置时,JavaConfig是更好的方案,它更为强大,类型安全并且对重构友好,因为它就是Java代码,因为JavaConfig是配置代码,也就意味着它不应该包含任何业务逻辑,也不应该侵入到业务逻辑代码之中,尽管不是必须的,但是通常将JavaConfig放到单独的包中。
@Configuration
public class CDPlayerConfig {
}
创建配置类的关键是添加@Configuration注解,该注解表面这个类是一个配置类,该类应该包含在Spring应用上下文中如何创建Bean的细节
声明简单的Bean
要在 JavaConfig 中声明 bean,需要编写一个方法,这个方法会创建所需类型的实例,然后给这个方法添加@Bean 注解。
@Bean
public CompactDisc sgtPeppers() {
return new SgtPepper();
}
默认情况下,bean 的 ID 与带有@Bean注解的方法名是一样的,这里就是sgtPeppers,如果要设置一个不同的名字,可以使用下面的方式:
@Bean(name = "loneyHeartsClubBand")
public CompactDisc sgtPeppers() {
return new SgtPepper();
}
只要是最终返回一个 CompactDisc 的实例,所以你可以在方法中做各种 Java 支持的处理,比如随机选择一个 CompactDisc 来返回等。
借助JavaConfig实现注入
前面声明的 CompactDisc bean 是非常简单的,没有任何的依赖,直接返回实例。但是如果我们要声明 CDPlayer bean,它依赖于CompactDisc,那该如何装配呢?
直接引用创建 bean 的方法:
@Bean
public CDPlayer cdPlayer() {
return new CDPlayer(sgtPeppers());
}
这里调用了需要传入 CompactDisc 对象的构造器来创建 CDPlayer 实例,CompactDisc 对象是通过 sgtPeppers()方法获得的,这看起来好像没什么问题,但是 agtPeppers 是添加了@Bean 注解的,这样 Spring 会拦截所有对它的调用,并确保直接返回该方法所创建的 bean,什么意思呢,就是 sgtPeppers 创建的实例对象成为单例的了,多个调用,实际上共享的是同一个 bean 对象。