自建博客地址:https://bytelife.net,欢迎访问! 本文为博客自动同步文章,为了更好的阅读体验,建议您移步至我的博客👇
虽然很多场景下可以使用组件扫描和自动装配来实现Spring的自动化配置,但有些时候自动化配置的方案是行不通的,因此需要明确配置Spring。比如你想讲第三方库中的组件装配到你的应用中,在这种情况下,你必须要显式装配。在进行显式配置的时候,有两种方案,Java和XML。
下面介绍通过Java代码显式装配Bean。
一、创建配置类
创建配置类的关键在于@Configuration注解,@Configuration注解表明该类是一个配置类,该类包含了在Spring上下文中如何创建Bean的细节。
package cn.javacodes.spring.configuration;
import org.springframework.context.annotation.Configuration;
/**
* Created by Eric on 2016/10/16.
*/
@Configuration
public class CDPlayerConfig {
}
二、声明简单的Bean
要在JavaConfig中声明Bean,我们需要写一个方法,这个方法会创建所需类型的实例,然后给这个方法添加@Bean注解。比如下面的代码声明了CompactDisc Bean:
@Bean
public CompactDisc transfer(){
return new Transfer();
}
@Bean注解会告诉Spring这个方法会返回一个对象,该对象要注册为Spring应用上下文中的bean。方法体中包含了最终产生bean对象的逻辑。
默认情况下,bean的ID于带有@Bean注解方法的名称是一样的。在上面的例子中,bean的名字将会是“transfer”。如果你想为它设置一个不同的名字,可以通过name属性指定它的ID:
@Bean(name = "transfer-cd")
public CompactDisc transfer(){
return new Transfer();
}
另外,方法中的方法体可以是任何你想创建Bean的逻辑,比如你想在一组CD中随机选取一个CD进行播放也是可以的。
三、借助JavaConfig实现注入
前面声明的CompactDisc Bean是非常简单的,因为它没有任何依赖,那么现在想要声明一个CDPlayer Bean,它依赖于CompactDisc。
(一)引用创建Bean的方法
@Bean
public CDPlayer cdPlayer(){
return new CDPlayer(transfer());
}
这里同样使用了@Bean注解,并在构造CDPlayer时将CompactDisc作为CDPlayer构造器的参数传入。
注意:这里虽然看起来是通过调用transfer()方法得到CompactDisc,但由于transfer方法使用了@Bean注解,实际上Spring会拦截所有对它的调用,并确保直接返回该方法所创建的Spring上下文中的bean,而不是每次都对其进行实际的调用。
比如说,假设你引入了另一个其他的CDPlayer Bean,它和之前的那个bean完全一样。
@Bean
public CDPlayer cdPlayer(){
return new CDPlayer(transfer());
}
@Bean
public CDPlayer anotherCDPlayer(){
return new CDPlayer(transfer());
}
默认情况下,Spring中的bean都是单例的,我们并没有必要为第二个CDPlayer Bean创建完全相同的CompactDisc实例。Spring会拦截对@Bean注解标注方法的调用并确保返回的是Spring创建的Bean。
(二)将依赖作为参数
可以看到通过引用创建Bean的方法来解决这个问题有些让人疑惑,下面这种方式看起来更为容易理解:
@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc){
return new CDPlayer(compactDisc);
}
在这里,cdPlayer()方法请求一个CompactDisc作为参数。当Spring调用cdPlayer()方法创建bean的时候,它会自动装配一个CompactDisc到配置方法中。这样方法体就可以在合适的位置使用它,通过这种方式可以避免明确的调用@Bean方法。
通过这种方式来引用其它Bean是最佳的选择,因为它不要求将依赖声明到同一个配置类当中,甚至它不要求必须要在JavaConfig中声明,实际上它可以通过组件扫描功能来自动发现或者通过XML来进行配置。
本例中使用了CDPlayer的构造器实现了DI(依赖注入),但是完全可以使用其它风格的DI,比如,你可以使用setter的方式进行注入。
--Posted from Rpc