服务器之家

服务器之家 > 正文

Spring装配Bean之用Java代码安装配置bean详解

时间:2021-01-23 12:45     来源/作者:wuxiwei

前言

本文主要给大家介绍了关于Spring之利用Java代码安装配置bean的相关内容,尽管通过组件扫描和自动装配实现Spring的自动化配置很方便也推荐,但是有时候自动配置的方式实现不了,就需要明确显示的配置Spring。比如说,想要将第三方库中的组件装配到自己的应用中,这样的情况下,是没办法在它的类上添加 @Compnent和 @Autowired注解的。

在这种情况下,需要使用显示装配的方式,可以分别通过Java和XML实现,推荐使用Java的方式,因为更加强大,类型安全并且重构友好,因为就和我们应用所写的Java代码一样。但是虽然JavaConfig和其他的java代码没有区别,但是在概念上是不同的。所以JavaConfig不应该出现业务逻辑的代码,并建议放在单独的包中,做隔离。

创建配置类

在之前,看到过JavaConfig,我们再看一下:

?
1
2
3
4
5
6
7
package soundsystem;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class CDPlayerConfig {
 
}

创建javaConfig类的关键在于为其添加 @Configuration注解,@Configuration注解表明这个类是一个配置类,该类应该包含Spring上下文中如何创建bean的细节。之前我们都是依赖组件扫描来发现Spring应该创建的bean。尽管可以同时使用组件扫描和显示配置,但是现在我们去掉了 @CompnentScan注解,现在的CDPlayerConfig类就没有任何作用了。如果现在运行之前的测试类,就会失败,并且出现BeanCreationException异常。

声明简单的bean

在JavaConfig中声明bean,需要编写一个方法,该方法会创建所需类型的实例,然后这个方法添加 @Bean注解。

?
1
2
3
4
@Bean
public CompactDisc sgtPeppers() {
 return new SgtPeppers();
}

@Bean注解会告诉Spring这个方法会返回一个对象,该对象要注册为Spring应用上下文中的bean。

默认情况下,bean的ID与带有 @Bean注解的方法名是一样的,在上面的例子中,bean的ID将会是sgtPeppers。如果想设置不同的ID,那么可以重命名该方法,也可以通过name属性指定一个不通的名字:

?
1
2
3
4
@Bean(name="lonelyHeartsClubBand")
public CompactDisc sgtPeppers() {
 return new SgtPeppers();
}

借助JavaConfig实现注入

前面声明的CompactDisc很简单,因为没有其他依赖。但现在,我们需要声明CDPlayer bean,它依赖于CompactDisc。

在javaConfig中装配bean的最简单方式就是引用创建bean的方法。

?
1
2
3
4
@Bean
public CDPlayer cdPlayer() {
 return new CDPlayer(sgtPeppers());
}

注意:看起来,CompactDisc是通过调用sgtPeppers()得到的,但情况并非完全如此。因为sgtPeppers()方法添加了 @Bean注解,Spring会拦截所有对它的调用,并确保直接返回该方法创建的bean,而不是每次都进行实际的调用。
假如引入另外一个CDPlayer bean,他和之前的那个bean完全一样:

?
1
2
3
4
5
6
7
8
9
@Bean
public CDPlayer cdPlayer() {
 return new CDPlayer(sgtPeppers());
}
 
@Bean
public CDPlayer anotherCDPlayer() {
 return new CDPlayer(sgtPeppers());
}

如果sgtPeppers()的调用是实际的方法调用,那么每个CDPlayer实例都会有一个特有的SgtPeppers实例。如果是实际的CD播放器和CD光盘的话,很ok,物理上没办法共用一张CD光盘在两个CD播放器上。

但是,在软件中,我们完全是可以将同一个SgtPeppers实例注入到任意数量的其它的bean中。默认情况下,Spring的bean都是单例的,我们并没有必要为第二个CDPlayer bean创建完全相同的SgtPeppers实例。

根本的问题在于,通过调用方法的方式来引入bean有点困惑,还有另外一种方式:

?
1
2
3
4
@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc) {
 return new CDPlayer(compactDisc);
}

通过这种方式引入其它的bean通常是最佳的方式,因为Spring并不会要求将CompactDisc声明放在同一个配置文件中,甚至不一定是JavaConfig中,可以将配置分布在XML、多个配置类以及自动扫描装配的bean中。

另外,这里的CDPlayer的构造器实现了DI功能,但是我们完全可以根据需求实例化CDPlayer,比如想通过Setter方法注入CompactDisc的话,可以这样:

?
1
2
3
4
5
6
@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc) {
 CDPlayer cdPlayer = new CDPlayer(compactDisc);
 cdPlayer.setCompactDisc = compactDisc;
 return cdPlayer;
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。

原文链接:http://www.cnblogs.com/wxw16/p/7704471.html

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
返回顶部