Spring装配Bean之用Java代码安装配置bean详解
前言
本文主要给大家介绍了关于spring之利用java代码安装配置bean的相关内容,尽管通过组件扫描和自动装配实现spring的自动化配置很方便也推荐,但是有时候自动配置的方式实现不了,就需要明确显示的配置spring。比如说,想要将第三方库中的组件装配到自己的应用中,这样的情况下,是没办法在它的类上添加 @compnent和 @autowired注解的。
在这种情况下,需要使用显示装配的方式,可以分别通过java和xml实现,推荐使用java的方式,因为更加强大,类型安全并且重构友好,因为就和我们应用所写的java代码一样。但是虽然javaconfig和其他的java代码没有区别,但是在概念上是不同的。所以javaconfig不应该出现业务逻辑的代码,并建议放在单独的包中,做隔离。
创建配置类
在之前,看到过javaconfig,我们再看一下:
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注解。
@bean public compactdisc sgtpeppers() { return new sgtpeppers(); }
@bean注解会告诉spring这个方法会返回一个对象,该对象要注册为spring应用上下文中的bean。
默认情况下,bean的id与带有 @bean注解的方法名是一样的,在上面的例子中,bean的id将会是sgtpeppers。如果想设置不同的id,那么可以重命名该方法,也可以通过name属性指定一个不通的名字:
@bean(name="lonelyheartsclubband") public compactdisc sgtpeppers() { return new sgtpeppers(); }
借助javaconfig实现注入
前面声明的compactdisc很简单,因为没有其他依赖。但现在,我们需要声明cdplayer bean,它依赖于compactdisc。
在javaconfig中装配bean的最简单方式就是引用创建bean的方法。
@bean public cdplayer cdplayer() { return new cdplayer(sgtpeppers()); }
注意:看起来,compactdisc是通过调用sgtpeppers()得到的,但情况并非完全如此。因为sgtpeppers()方法添加了 @bean注解,spring会拦截所有对它的调用,并确保直接返回该方法创建的bean,而不是每次都进行实际的调用。
假如引入另外一个cdplayer bean,他和之前的那个bean完全一样:
@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有点困惑,还有另外一种方式:
@bean public cdplayer cdplayer(compactdisc compactdisc) { return new cdplayer(compactdisc); }
通过这种方式引入其它的bean通常是最佳的方式,因为spring并不会要求将compactdisc声明放在同一个配置文件中,甚至不一定是javaconfig中,可以将配置分布在xml、多个配置类以及自动扫描装配的bean中。
另外,这里的cdplayer的构造器实现了di功能,但是我们完全可以根据需求实例化cdplayer,比如想通过setter方法注入compactdisc的话,可以这样:
@bean public cdplayer cdplayer(compactdisc compactdisc) { cdplayer cdplayer = new cdplayer(compactdisc); cdplayer.setcompactdisc = compactdisc; return cdplayer; }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。